判断点位于多边形内和边相交

  • 判断点位于多边形内

叉乘判别法:根据二维向量的叉乘判断,a×b的方向:四指由a开始,指向b,拇指的指向就是a×b的方向,垂直于a和b所在的平面;b×a的方向:四指由b开始,指向a,拇指的指向就是b×a的方向,垂直于b和a所在的平面;
在这里插入图片描述
(x1, y1)和(x2, y2)的叉积=x1y2-x2y1,如果值大于0 , 则表明 ( x2 , y2 ) 在 ( x1 , y1 )左边,反之在右边 ,等于0则意味着两个向量共线。
依次取向量AB和AP、BC和BP、CD和CP、DE和DP、EA和EP进行叉乘,判断所得值是否同号,如果存在不同号,即说明点不在多边形内。

  • 判断两条边是否相交

两条线段:第一条的两个端点为A(a, b),B(c, d);第二条的两个端点为C(e, f),D(g, h)
第一条线段可以用方程表示:
λ 1 A + ( 1 − λ 1 ) B = λ 1 ( A − B ) + B \lambda_1A + (1-\lambda_1)B=\lambda_1(A-B)+B λ1A+(1λ1)B=λ1(AB)+B
同理,第二条线段也可以用方程表示:
λ 2 C + ( 1 − λ 2 ) D = λ 2 ( C − D ) + D \lambda_2C + (1-\lambda_2)D=\lambda_2(C-D)+D λ2C+(1λ2)D=λ2(CD)+D
如果两条边相交,则两个方程相等,即:
λ 1 ( A − B ) + B = λ 2 ( C − D ) + D [ ( A − B ) ( C − D ) ] [ λ 1 λ 2 ] = D − B \lambda_1(A-B)+B=\lambda_2(C-D)+D\\ \left[\begin{matrix} (A-B) & (C-D)\end{matrix} \right]\left[\begin{matrix}\lambda_1\\\lambda_2 \end{matrix} \right]=D-B λ1(AB)+B=λ2(CD)+D[(AB)(CD)][λ1λ2]=DB
还需要考虑的一种情况是平行和重合,只需要求矩阵 [ ( A − B ) ( C − D ) ] \left[\begin{matrix} (A-B) & (C-D)\end{matrix} \right] [(AB)(CD)]的秩,只要秩小于2,即存在平行或者重合。
求出的 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2都必须在[0, 1]范围内,即可得到相交的点。

  • 将所有重合的点按顺序排列

根据所有点,求出重心,再依次求出每个点与中心的夹角,按大小排列,即可得到顺序,再判断相邻的点是否相似,即可得到最终结果。

参考github

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值