某公司的一道机考题的解答
来源:互联网 发布:excel数据录入系统 编辑:程序博客网 时间:2024/05/02 02:58
昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。
关于这个问题,我给出了自己的答案,首先解决第一个问题:
关于第二个问题稍微复杂些,不过幸好我在早期研究过并解决了一个更常见的问题,那就是判断一个点是否位于某个多边形内,而且即使这个多边形是凹多边形。这个功能在EnterpriseServerBase.XMath.Geometry.Polygon类中实现。
对于问题二的解答,我封装了Triangle类,它不仅借助Polygon类解决了问题二,而且可以计算三角形的面积和各个边长。
Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击这里下载。
关于这个问题,我给出了自己的答案,首先解决第一个问题:
/// <summary>
/// IsTriangle 判断集合中的头三个点PointF是否可以构成一个三角形
/// </summary>
public static bool IsTriangle(ArrayList ptList)
{
PointF pt0 = (PointF)ptList[0] ;
PointF pt1 = (PointF)ptList[1] ;
PointF pt2 = (PointF)ptList[2] ;
//如果有两个点相同
if(pt0.Equals(pt1) || pt0.Equals(pt2) || pt1.Equals(pt2) )
{
return false ;
}
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;
bool result0 = (length_01+length_02 <= length_12) ;
bool result1 = (length_01+length_12 <= length_02) ;
bool result2 = (length_02+length_12 <= length_01) ;
if(result0 || result1 || result2)
{
return false ;
}
return true ;
}
该解答分为两步,首先判断是否有重点,接着以两边之和大于第三边作为构成三角形的依据。/// IsTriangle 判断集合中的头三个点PointF是否可以构成一个三角形
/// </summary>
public static bool IsTriangle(ArrayList ptList)
{
PointF pt0 = (PointF)ptList[0] ;
PointF pt1 = (PointF)ptList[1] ;
PointF pt2 = (PointF)ptList[2] ;
//如果有两个点相同
if(pt0.Equals(pt1) || pt0.Equals(pt2) || pt1.Equals(pt2) )
{
return false ;
}
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;
bool result0 = (length_01+length_02 <= length_12) ;
bool result1 = (length_01+length_12 <= length_02) ;
bool result2 = (length_02+length_12 <= length_01) ;
if(result0 || result1 || result2)
{
return false ;
}
return true ;
}
关于第二个问题稍微复杂些,不过幸好我在早期研究过并解决了一个更常见的问题,那就是判断一个点是否位于某个多边形内,而且即使这个多边形是凹多边形。这个功能在EnterpriseServerBase.XMath.Geometry.Polygon类中实现。
对于问题二的解答,我封装了Triangle类,它不仅借助Polygon类解决了问题二,而且可以计算三角形的面积和各个边长。
public class Triangle
{
private ArrayList vertextList = null ;
private ArrayList lengthList = null ;
private float myArea = 0 ;
ctor#region ctor
public Triangle(ArrayList ptList)
{
if(! GeometryHelper.IsTriangle(ptList))
{
throw new ArgumentException("The points in list can't construct a triangle !") ;
}
this.vertextList = ptList ;
this.FillLengthList() ;
}
public Triangle(PointF pt0 ,PointF pt1 ,PointF pt2)
{
ArrayList ptList = new ArrayList() ;
ptList.Add(pt0) ;
ptList.Add(pt1) ;
ptList.Add(pt2) ;
if(! GeometryHelper.IsTriangle(ptList))
{
throw new ArgumentException("The points in list can't construct a triangle !") ;
}
this.vertextList = ptList ;
this.FillLengthList() ;
}
private void FillLengthList()
{
PointF pt0 = (PointF)this.vertextList[0] ;
PointF pt1 = (PointF)this.vertextList[1] ;
PointF pt2 = (PointF)this.vertextList[2] ;
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;
this.lengthList = new ArrayList() ;
this.lengthList.Add(length_12) ;
this.lengthList.Add(length_02) ;
this.lengthList.Add(length_01) ;
}
#endregion
Area ,GetEdgeLength#region Area ,GetEdgeLength
/**//// <summary>
/// Area 三角形的面积
/// </summary>
public float Area
{
get
{
if(this.myArea == 0)
{
this.myArea = this.GetArea() ;
}
return this.myArea ;
}
}
private float GetArea()
{
float len0 = (float)this.lengthList[0] ;
float len1 = (float)this.lengthList[1] ;
float len2 = (float)this.lengthList[2] ;
float p = (len0 + len1 + len2) * 0.5f ;
return (float)Math.Sqrt(p * (p-len0) * (p-len1) * (p-len2)) ;
}
public float GetEdgeLength(int index)//0<= index <=2
{
if((index <0) ||(index >2))
{
return 0 ;
}
return (float)this.lengthList[index] ;
}
#endregion
Contains#region Contains
/**//// <summary>
/// Contains 判断某点是否在三角形内部
/// </summary>
public bool Contains(PointF pt)
{
Polygon poly = new Polygon(this.vertextList) ;
return poly.Contains(pt) ;
}
#endregion
}
{
private ArrayList vertextList = null ;
private ArrayList lengthList = null ;
private float myArea = 0 ;
ctor#region ctor
public Triangle(ArrayList ptList)
{
if(! GeometryHelper.IsTriangle(ptList))
{
throw new ArgumentException("The points in list can't construct a triangle !") ;
}
this.vertextList = ptList ;
this.FillLengthList() ;
}
public Triangle(PointF pt0 ,PointF pt1 ,PointF pt2)
{
ArrayList ptList = new ArrayList() ;
ptList.Add(pt0) ;
ptList.Add(pt1) ;
ptList.Add(pt2) ;
if(! GeometryHelper.IsTriangle(ptList))
{
throw new ArgumentException("The points in list can't construct a triangle !") ;
}
this.vertextList = ptList ;
this.FillLengthList() ;
}
private void FillLengthList()
{
PointF pt0 = (PointF)this.vertextList[0] ;
PointF pt1 = (PointF)this.vertextList[1] ;
PointF pt2 = (PointF)this.vertextList[2] ;
float length_01 = (float)Math.Sqrt((pt0.X - pt1.X)*(pt0.X - pt1.X) + (pt0.Y - pt1.Y)*(pt0.Y - pt1.Y)) ;
float length_02 = (float)Math.Sqrt((pt0.X - pt2.X)*(pt0.X - pt2.X) + (pt0.Y - pt2.Y)*(pt0.Y - pt2.Y)) ;
float length_12 = (float)Math.Sqrt((pt2.X - pt1.X)*(pt2.X - pt1.X) + (pt2.Y - pt1.Y)*(pt2.Y - pt1.Y)) ;
this.lengthList = new ArrayList() ;
this.lengthList.Add(length_12) ;
this.lengthList.Add(length_02) ;
this.lengthList.Add(length_01) ;
}
#endregion
Area ,GetEdgeLength#region Area ,GetEdgeLength
/**//// <summary>
/// Area 三角形的面积
/// </summary>
public float Area
{
get
{
if(this.myArea == 0)
{
this.myArea = this.GetArea() ;
}
return this.myArea ;
}
}
private float GetArea()
{
float len0 = (float)this.lengthList[0] ;
float len1 = (float)this.lengthList[1] ;
float len2 = (float)this.lengthList[2] ;
float p = (len0 + len1 + len2) * 0.5f ;
return (float)Math.Sqrt(p * (p-len0) * (p-len1) * (p-len2)) ;
}
public float GetEdgeLength(int index)//0<= index <=2
{
if((index <0) ||(index >2))
{
return 0 ;
}
return (float)this.lengthList[index] ;
}
#endregion
Contains#region Contains
/**//// <summary>
/// Contains 判断某点是否在三角形内部
/// </summary>
public bool Contains(PointF pt)
{
Polygon poly = new Polygon(this.vertextList) ;
return poly.Contains(pt) ;
}
#endregion
}
Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击这里下载。
- 某公司的一道机考题的解答
- 某公司的数据仓库考题
- 某公司的考题
- 某公司的数据仓库考题(转)
- 某公司的一道试题
- 某公司招聘品质工程师的考题
- 某公司面试的一道智力题
- 一道关于异常的考题!
- IBM 的一道考题(转)
- 网宿的一道考题
- 一道String拼接的考题
- 一道题目的解答
- 用C#实现的一道公务员考题
- 08一级建造师的一道考题
- 由一道高考题而想到的
- 一道c题的解答
- 一道题的不同解答
- 一道面试题的解答
- 分页管理器实现
- 动态调用web服务
- 使用 EmptyClass 避免条件判断
- Effective C# 精髓 (待续)
- 开始学习spring.net
- 某公司的一道机考题的解答
- 路径规划(最短路径)算法C#实现
- 推荐所有的.NET开发人员阅读《J2EE Development without EJB》
- EsbAOP应用--权限管理
- EsbAOP应用--异常关闭器
- EnterpriseServerBase的AOP--EsbAOP实现
- 企业开发基础设施--事件通知服务(Remoting双向通信)
- 关于跨程序集的反射
- 异步调用轻量级封装AsynCaller