1. 程式人生 > >判斷點是否線上段上(C++實現)

判斷點是否線上段上(C++實現)

判斷點是否線上段上:

設點為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)兩個條件必須同時滿足才能返回真值。

  BOOL CGe::PtInLine(double x,double y,double z,
        
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&&
 DoubleComp(z,z2)==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;
}