判斷點是否線上段上(C++實現)
阿新 • • 發佈:2019-02-08
判斷點是否線上段上:
設點為Q,線段為P1P2 ,判斷點Q在該線段上的依據是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2為對角頂點的矩形內。前者保證Q點在直線P1P2上,後者是保證Q點不線上段P1P2的延長線或反向延長線上,對於這一步驟的判斷可以用以下過 程實現:
ON-SEGMENT(pi,pj,pk)
if min(xi,xj)<=xk<=max(xi,xj) and min(yi,yj)<=yk<=max(yi,yj)
then return true;
else return false;
特別要注意的是,由於需要考慮水平線段和垂直線段兩種特殊情況,min(xi,xj)<=xk<=max(xi,xj)和min(yi,yj)<=yk<=max(yi,yj)兩個條件必須同時滿足才能返回真值。
double x1,double y1,double z1,
double x2,double y2,double//判斷目標點是否是端點if(DoubleComp(x,x1)==0&& DoubleComp(y,y1)==0&& DoubleComp(z,z1)==0)
{
return TRUE;
}
if(DoubleComp(x,x2)==0&& DoubleComp(y,y2)==0&&
{
return TRUE;
}
//
double d = DistPt2Line(x,y,z,x1,y1,z1,x2,y2,z2);
if(DoubleComp(d,1e-6) >0)//(d > 1e-6) {
return FALSE;
}
if(DoubleComp(x1,x2) !=0)//(x1 != x2) {
if( ((DoubleComp((x-x1),0)<0)&&(DoubleComp((x-x2),0)>0)) ||
((DoubleComp((x-x1),0)>0)&&(DoubleComp((x-x2),0)<0)) )
{
return TRUE;
}
}
if(DoubleComp(y1,y2) !=0)//(y1 != y2) {
if( ((DoubleComp((y-y1),0)<0)&&(DoubleComp((y-y2),0)>0)) ||
((DoubleComp((y-y1),0)>0)&&(DoubleComp((y-y2),0)<0)) )
{
return TRUE;
}
}
if(DoubleComp(z1,z2) !=0)
{
if( ((DoubleComp((z-z1),0)<0)&&(DoubleComp((z-z2),0)>0)) ||
((DoubleComp((z-z1),0)>0)&&(DoubleComp((z-z2),0)<0)) )
{
return TRUE;
}
}
return FALSE;
}