【发布时间】:2017-03-20 04:23:14
【问题描述】:
【问题讨论】:
标签: matlab geometry 2d computational-geometry
【问题讨论】:
标签: matlab geometry 2d computational-geometry
第一个凹四边形:
第6个交叉点应该也在1)我只是忘记在那儿画了。
计算所有交点并将它们与线配对
l1: p2,p5,p6
l2: p1,p4,p6
l3: p1,p2,p3
l4: p3,p4,p5
l 表示直线,p 表示交点
判断点只是边缘还是中间
所以中间点是如果你从它所属的线的每一侧得到另一个点。换句话说,如果您将点转换为其参数位置(或距某个起点的距离),则中间点位于其他两点距离之间。您在相交计算时直接获得的参数/距离,但如果您不这样做,您可以使用:
t(p) = dot(p-A,B-A)
其中A,B 是线端点,p 是查询的交点,t(p) 是它与A 的标量“距离”。
所以找出哪些点只是边缘e,哪些是中间m:
l1: e2,e5,m6
l2: e1,e4,m6
l3: e1,m2,e3
l4: e3,m4,e5
现在,如果任何点至少有一次中间,那么它就是部分中间,如果它只是边缘,那么它就是边缘,如果它只是中间,那么它就是中间:
edge: p1,p3,p5
partial: p2,p4
middle: p6
构造多边形
所以我们必须使用边缘点。我们跳过的部分点(因为它们位于已经使用的线上),最后我们也使用中间点。我们知道我们的多边形将是:
(p1,p3,p5) + (p6)
现在我们需要找到凹的中间点p6会去哪里。有3种组合:
e1,m6,e3,e5
e1,e3,m6,e5
e1,e3,e5,m6
我们知道m6 属于l1,l2 和l1,l2 也有p2,p5,p1,p4,它们只是边缘点:e1,e5 所以m6 将放在它们之间,所以正确的解决方案是:
e1,e3,e5,m6
现在是凸四边形:
如果我们利用 #1,#2 来形成凸四边形,我们必须使用中间点和部分中间点并选择一个纯边缘点。选择不属于纯中点的线。所以我们必须使用:
(p2,p4) + (m6) + one_from(e1,e3,e5)
m6 不属于l3,l4,所以我们需要找到属于两者的边,即e3 所以
(p2,p4) + (m6) + (e3)
现在我们只需要找出顺序。中间点和边缘点不会靠近自己,所以你有 2 个解决方案:
p2,m6,p4,e3
p2,e3,p4,m6
两者都是正确的,它们只是自身的反转(不同的多边形缠绕规则),因此您可以根据任意两个相邻顶点的叉积的z 坐标选择您需要的那个。
【讨论】:
求解每个线对的线性方程组
y = m[i] * x + b[i]
y = m[j] * x + b[j]
其中 m[i], b[i] 是第 i 行的系数,得到 (x,y) 的交集。
如果正好有 6 个交点(没有平行线,没有退化),那么每条线都有三个交点。两个交点是“外”,一个(中间)是“内”,所以有三个内点和三个外点。
好像凸四边形总是包含所有三个内点,所以我们可以分离内点,得到对应的第四个点。
例如,如果线被指定为A,B,C,D,并且交点AB,AC,CD在内部,那么第四点是交点BD(B和D在交点列表中是唯一的)
附:请注意,线方程形式y=mx+b并不适合所有可能的线(不适用于垂直线),因此最好使用more general form,如A*x + B*y + C = 0或其他。
【讨论】: