线段是否相交的判断方法

 

判断一点在已知直线的左侧还是右侧。


直角坐标系


 

f(x,y) = (y-y1)(x2-x1) - (x-x1)(y2-y1)

if  f(x3,y3) > 0

    P(x3,y3)P1P2的左侧

if  f(x3,y3) < 0

    P(x3,y3)P1P2的右侧

if  f(x3,y3) = 0

    P(x3,y3)P1P2线上。


判断两线段是否相交(网上资料)

bool IsLineSegmentCross(POINT pFirst1, POINT pFirst2, POINT pSecond1, POINT pSecond2)

{

        //每个线的两点都在另一个线的左右不同能断定线相交

        //公式于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左,,线.

        long Linep1,Linep2;

        //判断pSecond1pSecond2是否在pFirst1->pFirst2两侧

        Linep1 = pFirst1.x * (pSecond1.y - pFirst2.y) +

               pFirst2.x * (pFirst1.y - pSecond1.y) +

               pSecond1.x * (pFirst2.y - pFirst1.y);

        Linep2 = pFirst1.x * (pSecond2.y - pFirst2.y) +

               pFirst2.x * (pFirst1.y - pSecond2.y) +

               pSecond2.x * (pFirst2.y - pFirst1.y);

        if ( ((Linep1 ^ Linep2) >= 0 ) && !(Linep1==0 && Linep2==0))//符号位异或为0:pSecond1pSecond2pFirst1->pFirst2同侧

        {

               return false;

        }

        //判断pFirst1pFirst2是否在pSecond1->pSecond2两侧

        Linep1 = pSecond1.x * (pFirst1.y - pSecond2.y) +

               pSecond2.x * (pSecond1.y - pFirst1.y) +

               pFirst1.x * (pSecond2.y - pSecond1.y);

        Linep2 = pSecond1.x * (pFirst2.y - pSecond2.y) +

               pSecond2.x * (pSecond1.y - pFirst2.y) +

               pFirst2.x * (pSecond2.y - pSecond1.y);

        if ( ((Linep1 ^ Linep2) >= 0 ) && !(Linep1==0 && Linep2==0))//符号位异或为0:pFirst1pFirst2pSecond1->pSecond2同侧

        {

               return false;

        }

        //否则判为相交

        return true;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值