【发布时间】:2016-07-28 03:23:28
【问题描述】:
我正在构建一个工具,该工具最终将利用 Google Maps API v3 在固定“网格”系统(例如,co-从地球的 0,0 点开始,每 0.0001 latlong 单位间隔的纵坐标)。
我编写了代码,用户可以在其中单击地图上的某个区域,该代码会绘制轮廓并填充找到的正方形。用户可以单击该正方形的其他相邻位置以构建一个越来越大的“块状”多边形,并且可以单击单个正方形将其删除。我自己在 HTML5 canvas/JavaScript 以及 Google Maps API 中测试了所有这些。
现在我想编写删除所有内部边/顶点的代码,以便它只绘制这个多边形的最外层边界,以便它实际上被绘制为一个大多边形,而不是一组正方形。可以这样想:尽管我们知道像澳大利亚、美国等国家是由多个州组成的,但当我们在该国周围绘制边界时,我们通常对所有州的边界并不感兴趣,可以删除那些之间的线,只画外边界。这与我想要完成的事情相同,只是使用正方形网格而不是复杂的多边形。
我当前的代码在这里:
https://jsfiddle.net/wyxcvmdf/14/
HTML:
<canvas id="myCanvas" width="500" height="250" style="border:1px solid #000000;"></canvas>
<!--etc.-->
JavaScript:
// don't forget to set load type in jsfiddle to no wrap in <body>
// define the global variable and some helper variables to make the code shorter
var gv = {};
gv.o = function(id) {
return document.getElementById(id)
};
gv.i = 'innerHTML';
// etc.
关于我的代码的一些解释性说明:
• 每个正方形的“原点”是该正方形左下角的顶点。没有特别的原因。
• 就 HTML5 画布如何绘制轮廓而言,“绘制方向”是从原点逆时针方向。同样,没有特别的原因。
• 您还不能“单击”添加正方形,因为这只是概念验证,因此您可以通过在相关文本输入框中输入 x 和 y 坐标来添加正方形
我想到的证明我的代码所需的用例/测试是:
将正方形添加到具有 1 个重复顶点的多边形(工作)
在所有情况下将正方形添加到具有 2 个和 3 个重复顶点的多边形:相邻边、非相邻边、非连续顶点(目前仅适用于第一种情况)
在所有情况下将正方形添加到具有 4 个重复顶点的多边形中:堵塞孔、堵塞孔的一部分、连接多个多边形(目前仅适用于第一种情况)
在上述情况下从具有 1 个重复顶点的多边形中删除正方形(尚未开发,但应该有效地“反向”添加代码)
在上述情况下从具有 2 个和 3 个重复顶点的多边形中删除正方形(尚未开发,但实际上应该是添加代码的“反向”)
在上述情况下从具有 4 个重复顶点的多边形中删除正方形(尚未开发,但应该有效地“反向”添加代码)
在具有多个内部边界的多边形外部进行正方形添加/删除,即孔(尚未开发,可能很棘手)
在具有多个内边界的多边形内部进行正方形添加/删除,即孔(尚未开发,可能会很棘手)
注意 1:我使用“正方形”、“边”等,而不是“多边形”等,只是为了解释的简单。
注意 2:我已经对类似的问题和可能的解决方案进行了大量研究,但还没有真正找到能满足我需求的任何东西。我所做的研究是:
旅行推销员问题。 但是,这不是关于优化路径 - 它是关于确保路径是“可绘制的”并因此朝着一个方向前进。只要最终的形状看起来像用户期望的那样,重叠的顶点就完全没问题。
凸包算法。 不适用,因为包可能是凸的、凹的甚至是不连续的!另外,我认为通过简化为网格系统,我消除了存在许多分散顶点的问题,您需要确定它们与中心点的距离,使用三角法等。
凹壳解决方案。这更接近于解决我的问题,但是我看到的是有很多商业工具(例如 ArcGIS)的插件可以做到这一点,但是没有涵盖我所有用例的通用代码(无论编程语言如何)。
基于图块的游戏。您会认为任何需要在图块周围绘制边界的基于图块的游戏(例如,实时战略游戏中玩家的领土)都可以解决这个问题问题,但不是我能看到的。
【问题讨论】:
-
"删除任何内部边/顶点,使其仅绘制此多边形的最外边界" + "简化的固定网格/正方形系统,而不是复杂的多边形"(如何)这与低分辨率 flood filll 有何不同?
-
泛洪填充的概念看起来很有趣,但是快速浏览一下,它似乎只填充了一系列像素,没有定义外边界,只绘制了这个边界。不过我会仔细看看,谢谢。
标签: javascript html algorithm google-maps html5-canvas