在做UI部分的时候要求出点是否在线段上,然而操作上实际是一个矩形区域才对,也就是说应该是点到矩形的距离.因为我们画的线段是有宽度的.我的算法是近似算法,其实也是对点到线段的计算,只是有一部分的精确程度不高,变成了区域了.
言归正传
先给出点是否在线段上的算法
public bool IsContains(PointF p)
{
float a1,a2;
float f1,f2,f3,f4;
f1=p.X-HeadX;
f2=p.Y-HeadY;
f3=TailX-HeadX;
f4=TailY-HeadY;
a1=(f1)/(f3);
a2=(f2)/(f4);
if(f3==0f && p.X<=HeadX && a2>=0f && a2<=1f)
return true;
if(f4==0f && p.Y==HeadY && a1>=0f && a1<=1f)
return true;
if(a1==a2 && a1>=0f && a1<=2f && a2>=0f && a2<=2f)
return true;
return false;
}
接下来是改进的算法
public bool IsContains(PointF p)
{
float a1,a2;
float f1,f2,f3,f4;
f1=p.X-HeadX;
f2=p.Y-HeadY;
f3=TailX-HeadX;
f4=TailY-HeadY;
a1=(f1)/(f3);
a2=(f2)/(f4);
Console.WriteLine("a1 :"+a1+" a2 :"+a2);
if(f3==0f && (p.X-HeadX>=-1 && p.X-HeadX<=1) && a2>=0f && a2<=1f)
return true;
if(f4==0f && (p.Y-HeadY>=-1 && p.Y-HeadY<=1) && a1>=0f && a1<=1f)
return true;
if(a1-a2>-.1 && a1-a2<.1 && a1>=0f && a1<=1f && a2>=0f && a2<=1f)
return true;
return false;
}
其中HeadX HeadY为线段的头点坐标 TailX TailY为尾点坐标,可以颠倒,没有太大影响.p.X p.Y提供当前点坐标
可以看出主要区别在于最后一个判断上.当然了算法求的只是近似值,我只试验了几个方向上的线段,可以用,也许会有某些误差,数学忘好多.没办法论证了.有空的吧.