如何对谷歌地图多边形中的点进行排序以使线不交叉?
Posted
技术标签:
【中文标题】如何对谷歌地图多边形中的点进行排序以使线不交叉?【英文标题】:How to sort points in a Google maps polygon so that lines do not cross? 【发布时间】:2011-01-23 09:36:59 【问题描述】:我正在尝试制作一张地图,用户可以在其中勾勒出他们想要的任何形状。但是我遇到了一个问题,用户可以选择使多边形的线交叉并排除我想包括的区域的点。
要了解我在说什么,请转到this page 并采取以下步骤:
-
点击 4 个点来制作 4 个角
一个盒子
在 4 个之间单击
你刚刚提出的进一步的观点
定义框的周长
点击完成
您应该会看到如下内容:
有没有简单的方法来解决这个问题,或者我基本上是在处理“旅行推销员”类型的情况?所有的逻辑都是用 javascript 完成的,所以如果你想看看我是怎么做的,请随意“查看源代码”。
【问题讨论】:
【参考方案1】:它不是凸包。
想象一下,如果您在两条线交叉处附近的“Linfield Oaks”停留。凸包会跳过这个并在“international”和“82”之间画一条直线
您要做的是确定每个新点是否在由现有点形成的多边形内 - 如果是,那么您需要打破最近的多边形边并将新点插入该边。 有关多边形测试中的点,请参见 http://softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm。
【讨论】:
【参考方案2】:我过去解决了一个类似的问题,遇到了 Jeffrey 提到的不知道用户期望的确切形状的问题。我最终通过要求用户选择他们希望新点介于两者之间的两点来解决该问题。它需要更多的点击(3 对 1),但用户完全可以控制他们想要的形状。如果您有兴趣,我可能还保留着我在某处使用的代码(用于 Google 地图)。
【讨论】:
【参考方案3】:凸包可能包含用户希望排除的区域。这是解决此问题的另一种方法,可能会产生更令人满意的结果。检查每条线以查看哪些线交叉(有很多方法可以做到这一点)。然后反转出现在这两条线之间的点的子序列。
例如,假设给定点 A-B-C-D-E-F-A,其中 B-C 和 E-F 交叉。您可以通过反转子序列 C..E 来取消它们,从而得到 A-B-E-D-C-F-A。
无论如何都要尝试一下。
【讨论】:
以上是关于如何对谷歌地图多边形中的点进行排序以使线不交叉?的主要内容,如果未能解决你的问题,请参考以下文章