【发布时间】:2019-05-22 16:44:07
【问题描述】:
我正在尝试从以下方法中找到一种更有效的方法来确定一个点属于哪个六边形:
- 一个点数组 - 为了论证,10000 个点。
- 六边形中心点阵列,大约 1000 个六边形。
- 每个点都属于一个六边形,一些(大部分)六边形是空的。
- 六边形形成一个完美的网格,其中一个六边形的点从左上角开始(它将与整个区域的边缘重叠)。
我目前的解决方案有效,但我认为 n * (m log m) 相当慢,n=length(points) 和 m=length(hexagons)。
我怀疑我可以做得比这更好,想到的一种解决方案是(仅一次)将点和六边形按它们到某个任意点(可能是中间,可能是一个角)的距离进行排序,然后迭代在点和六边形的子集上,从到该点的距离大于等于的第一个六边形到最后一个匹配的六边形。同样,一旦 (point -> ref point) 和 (hexagon center -> ref point) 之间的距离差大于六边形的“半径”,我们就可以停止查看六边形。理论上,既然我们知道每个点都属于一个六边形,我什至不必考虑这种可能性。
我的问题是:有没有比这更多更好的方法呢?就复杂性而言,我认为最坏的情况会稍微好一点n * m,但平均情况应该非常好,可能在n * 20 的范围内(例如,我们每点只需要查看 20 个六边形)。以下是我目前的低效解决方案供参考。
points.forEach((p) => {
p.hex = _.sortBy(hexes, (hex) => {
const xDist = Math.abs(hex.middle.x - p.x);
const yDist = Math.abs(hex.middle.y - p.y);
return Math.sqrt((xDist * xDist) + (yDist * yDist));
})[0];
});
【问题讨论】:
-
redblobgames.com/grids/hexagons/#pixel-to-hex 是否通过公式演示方形网格坐标到十六进制映射来解决您正在查看的内容?
-
这非常酷 - 我不是 100% 肯定,但我绝对会看看 - 我开始研究 QuadTrees,因为它可能会这样做,但它看起来可能效率较低
-
@JasonAller 哇,这个资源太棒了!
-
1000 个六边形中的 10000 个点和大多数空的六边形听起来不正确。
-
如果网格是规则的,您可以在 O(1) 时间内计算任意点的图块索引。因此,对于 n 个点,O(n)。无需预处理。
标签: javascript sorting computational-geometry