C#判断三个点是否构成三角形和某个点是否在三角形内

6 篇文章 0 订阅

昨天看到某个公司招聘出的一道题目,题目是这样的:判断任意三个点是否构成三角形,以及某个点是否位于指定的三角形内。
    关于这个问题,我给出了自己的答案,首先解决第一个问题:

 
 
/// <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 ; }

 该解答分为两步,首先判断是否有重点,接着以两边之和大于第三边作为构成三角形的依据。

    关于第二个问题稍微复杂些,不过幸好我在早期研究过并解决了一个更常见的问题,那就是判断一个点是否位于某个多边形内,而且即使这个多边形是凹多边形。这个功能在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 }

Polygon类的实现比较复杂,代码也比较多,源码就不列出来了,可以到这里下载:zhuweisky.cnblogs.com/Files/zhuweisky/Polygon.rar
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值