C# 点在线段上

       // 判断一点是否在指定线段中  

       //线段ab,a(ax,ay),b(bx,by),p(x,y);判断点p是否在线段ab上 
        public static   bool PtInSegment(double x, double y, double ax, double ay, double bx, double by)
        {
            #region
            /*利用斜率是否相同进行判断
            if (((x <= ax && x >= bx) || (x <= bx && x >= ax)) && ((y <= ay && y >= by) || (y <= by && y >= ay)))
            {
                if (ax == bx || ay==by)
                    return true;
                double result = (by - ay) / (bx - ax) - (y - ay) / (x - ax);

                return Math.Abs(result) < 0.1;

            }
            return false;
             * */
            #endregion
            #region
          
            //利用三角形定理判断 两边之和大于第三边
            //线段ap的长度
            double a_p = Math.Sqrt(Math.Pow(Math.Abs(ax - x), 2) + Math.Pow(Math.Abs(ay - y), 2));
            //线段b_p的长度
            double b_p = Math.Sqrt(Math.Pow(Math.Abs(bx - x), 2) + Math.Pow(Math.Abs(by - y), 2));
            //线段ab的长度
            double a_b = Math.Sqrt(Math.Pow(Math.Abs(ax - bx), 2) + Math.Pow(Math.Abs(ay - by), 2));
            //线段a_p和线段b_p的和
            double a_p_b = a_p + b_p;
            if (a_p_b - a_b < 0.5)
            {
                return true;
            }
            else
            {
                return false;
            }
          
            /*
            #endregion
            //利用向量的叉积进行判断,确定不可以进行模糊匹配
            //p(x,y),a(ax,ay),b(bx,by)
            //线段ab的向量表示(bx-ax,by-ay)
            //线段ap的向量表示(x-ax,y-ay)
            //向量ab和向量ap的叉积abp=(bx-ax)*(y-ay)+(by-ay)*(x-ax)
            double abp = (bx - ax) * (y - ay) -(by - ay) * (x - ax);
            double  MaxX = Math.Max(ax, bx);
            double MinX = Math.Min(ax, bx);
            double MaxY = Math.Max(ay, by);
            double MinY = Math.Min(ay, by);
            ax = MinX; bx = MaxX; ay = MinY; by = MaxY;
            if (ax <= x &&x<= bx && ay <= y &&y<= by )
            {
                if(Math .Abs (abp )==0)
                return true;
            }
            return false ;
            */

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值