- 判断点位于多边形内
叉乘判别法:根据二维向量的叉乘判断,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(A−B)+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(C−D)+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(A−B)+B=λ2(C−D)+D[(A−B)(C−D)][λ1λ2]=D−B
还需要考虑的一种情况是平行和重合,只需要求矩阵
[
(
A
−
B
)
(
C
−
D
)
]
\left[\begin{matrix} (A-B) & (C-D)\end{matrix} \right]
[(A−B)(C−D)]的秩,只要秩小于2,即存在平行或者重合。
求出的
λ
1
\lambda_1
λ1和
λ
2
\lambda_2
λ2都必须在[0, 1]范围内,即可得到相交的点。
- 将所有重合的点按顺序排列
根据所有点,求出重心,再依次求出每个点与中心的夹角,按大小排列,即可得到顺序,再判断相邻的点是否相似,即可得到最终结果。
参考github