昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。
关于这个问题,我给出了自己的答案,首先解决第一个问题:
关于第二个问题稍微复杂些,不过幸好我在早期研究过并解决了一个更常见的问题,那就是判断一个点是否位于某个多边形内,而且即使这个多边形是凹多边形。这个功能在EnterpriseServerBase.XMath.Geometry.Polygon类中实现。
对于问题二的解答,我封装了Triangle类,它不仅借助Polygon类解决了问题二,而且可以计算三角形的面积和各个边长。
public
class
Triangle
{
privateArrayListvertextList=null;
privateArrayListlengthList=null;
privatefloatmyArea=0;



ctor#regionctor
publicTriangle(ArrayListptList)
{
if(!GeometryHelper.IsTriangle(ptList))
{
thrownewArgumentException("Thepointsinlistcan'tconstructatriangle!");
}

this.vertextList=ptList;
this.FillLengthList();
}

publicTriangle(PointFpt0,PointFpt1,PointFpt2)
{
ArrayListptList=newArrayList();
ptList.Add(pt0);
ptList.Add(pt1);
ptList.Add(pt2);

if(!GeometryHelper.IsTriangle(ptList))
{
thrownewArgumentException("Thepointsinlistcan'tconstructatriangle!");
}

this.vertextList=ptList;
this.FillLengthList();
}

privatevoidFillLengthList()
{
PointFpt0=(PointF)this.vertextList[0];
PointFpt1=(PointF)this.vertextList[1];
PointFpt2=(PointF)this.vertextList[2];

floatlength_01=(float)Math.Sqrt((pt0.X-pt1.X)*(pt0.X-pt1.X)+(pt0.Y-pt1.Y)*(pt0.Y-pt1.Y));
floatlength_02=(float)Math.Sqrt((pt0.X-pt2.X)*(pt0.X-pt2.X)+(pt0.Y-pt2.Y)*(pt0.Y-pt2.Y));
floatlength_12=(float)Math.Sqrt((pt2.X-pt1.X)*(pt2.X-pt1.X)+(pt2.Y-pt1.Y)*(pt2.Y-pt1.Y));

this.lengthList=newArrayList();
this.lengthList.Add(length_12);
this.lengthList.Add(length_02);
this.lengthList.Add(length_01);
}

#endregion


Area,GetEdgeLength#regionArea,GetEdgeLength

/**////<summary>
///Area三角形的面积
///</summary>
publicfloatArea
{
get
{
if(this.myArea==0)
{
this.myArea=this.GetArea();
}

returnthis.myArea;
}
}

privatefloatGetArea()
{
floatlen0=(float)this.lengthList[0];
floatlen1=(float)this.lengthList[1];
floatlen2=(float)this.lengthList[2];

floatp=(len0+len1+len2)*0.5f;

return(float)Math.Sqrt(p*(p-len0)*(p-len1)*(p-len2));
}


publicfloatGetEdgeLength(intindex)//0<=index<=2
{
if((index<0)||(index>2))
{
return0;
}

return(float)this.lengthList[index];
}
#endregion


Contains#regionContains

/**////<summary>
///Contains判断某点是否在三角形内部
///</summary>
publicboolContains(PointFpt)
{
Polygonpoly=newPolygon(this.vertextList);

returnpoly.Contains(pt);
}
#endregion
}
Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击 这里下载。
关于这个问题,我给出了自己的答案,首先解决第一个问题:
///
<summary>
/// IsTriangle判断集合中的头三个点PointF是否可以构成一个三角形
/// </summary>
public static bool IsTriangle(ArrayListptList)
{
PointFpt0 = (PointF)ptList[ 0 ];
PointFpt1 = (PointF)ptList[ 1 ];
PointFpt2 = (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(ArrayListptList)
{
PointFpt0 = (PointF)ptList[ 0 ];
PointFpt1 = (PointF)ptList[ 1 ];
PointFpt2 = (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类解决了问题二,而且可以计算三角形的面积和各个边长。














































































































Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以点击 这里下载。