判断点是否在线段上(C++实现)

本文详细介绍了如何判断一个点是否位于二维空间中指定的线段上,通过数学公式及伪代码的方式阐述了具体的判断逻辑,并考虑了特殊线段的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断点是否在线段上:

设点为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  z2)
{//from http://blog.youkuaiyun.com/hoya5121
    
// 判断目标点是否是端点
     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;
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值