是否有一个简单的算法可以找到两个多边形之间的分隔线,使它们位于线的两侧?或者最好是否有人知道这样做的图书馆?任何帮助将不胜感激
编辑:
我的解决方案:
我使用了JTS:http://www.vividsolutions.com/jts/JTSHome.htm
使用此库创建了两个多边形并运行DistanceOp以查找多边形之间的两个最近点(不一定是顶点)。然后简单地计算连接它们的线的垂直线。
答案 0 :(得分:3)
让 A 和 B 成为你的两个多边形。首先找到每个convex hull, C(A)和 C(B)。 显然,将 A 与B分开的行也将 C(A)与 C(B)分开。 让 a 成为C(A)上的一个点, b 是 C(B)上的一个点。人们可以走 a 和 b 边界直到找到通过 a 和 b 的分隔线。这可以 在线性时间完成,但我现在不会这样描述。
答案 1 :(得分:2)
假设您有一个带有点A1,A2,A3,...,AN的多边形A和一个带有点B1,B2,B3,...,BM的多边形B.
您可以做的是描述每个可能组合的点AX到BX的线(A1& B1,A1& B2,...... AN& BM)。
这样的线可以用参数格式描述:SomePoint = InicialPoint + Direction * t,并且可能是候选到“分离线”。保持它!
现在你要做的是将每个多边形的每个点的另一个矢量描述到这个候选行。每条线都有它的方向向量。
如果每条线的方向矢量与候选方向矢量的叉积具有相同的方向(Z-正或Z-负),则意味着这些点位于分离线的同一侧(仍为候选)
现在检查您为每个多边形的每个点描述的所有线条。您可以确定多边形A的所有点是否在一侧,而多边形B中的所有点都在另一侧......然后您找到了所需的线。如果没有,你必须尝试下一个候选线(AX-BX)。如果您没有找到任何这些与所有可能候选线的组合,则意味着您在多边形之间有一个交叉点。
我不确定它是否是最好/最快的算法,但我确信它有效。