点与线段的位置关系-算法

问题是这样的有一条路和一个商店,知道路和商店的坐标位置,现在想知道商店在这条路的左边还是右边?


采用叉乘(向量积)的定义来判断。


                    | x   y   z |

da X db =   |3   0   0|   = 0x + 0y - 9z = -9z < 0

                    |-1 -3  0|


使用右手定则判断其值确实应该是<0的


ab方向为正方向,那么点在线段的右侧,其向量积<0。同样还能得到,点在线段的左侧向量积>=0,

点在线段上向量积=0.



下面用代码实现:


公式:da X db = [(X1 - X3)*(Y2 - Y3) - (X2 - X3)*(Y1 - Y3)] Z


struct Point

{

      float x;

      float y;

}


int RelationPointandLine(Point& pt, vector<Point>& Line)

{

    // 假设Line中有两个点

    float fZ = (Line.at(0).x - pt.x) * (Line.at(1).y - pt.y) - (Line.at(1).x - pt.x)*(Line.at(0).y - pt.y);

    if(fz < 0.000001 && fz > -0.000001)

    {

        return 0;      // 在线段上

    }

   else if(fz > 0)

    {

        return 1;      // 在线段的左侧

    }

    else

    {

        return -1;      // 在线段的右侧

    }









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值