// 判断一点是否在指定线段中
//线段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 ;
*/
}