如何识别随机生成的点落在地图上的哪个区域?我已经在 stackoverflow 上发布了这个问题但被指向社区,因为它更有可能得到答案。 还有一张图片表示我的问题需要什么。
本质上,我有一个由几个矩形区域组成的“地图”。 我可以访问每个矩形区域的所有顶点的坐标(它们的 x_min、x_max、y_min、y_max)。
我随机生成一个位于该地图上任意位置的点。 我知道那个点的坐标(x 和 y)。 我要解决的问题是找出该点所在的区域。
我所做的,只是通过一个大的条件语句来检查点的 x & y 坐标是否在每个区域的 x_min 和 x_max 以及 y_min 和 y_max 之间。 但是,我觉得必须有一种更具可扩展性、可推广性和效率的方法来做到这一点,但我找不到这样做的方法,至少不是不同编程语言库中没有的方法。 我想可能会做一些事情,将地图分成两半,找出点在哪一半,计算那一半中的所有区域,检查是否还剩下一个区域,如果没有,再次将地图分成两半,然后再次经历这个过程。 我只是不知道如何实施以及这是否可行或比我目前的方法更好。
脚本编写视窗回复:如何确定随机生成的点落在地图上的哪个区域?如果我要为平铺矩形区域发明一种算法,我会使用 KDTable 函数并将所有角点加载到表格中。 像这样的东西:
一到四个矩形共享每个角
KDTable 将有效地告诉哪个角最接近任何查询的 xy 位置。 如果您保留另一个包含共享该点的所有矩形的表格,则您最多只需要检查四个。 根据您对数据的排序方式,只需知道
KDTable 在 K 维中几乎完成了您所描述的工作。对于 xy 数据,K==2。
回复:如何确定随机生成的点落在地图上的哪个区域?或者也许更难。
这将找到错误的角落。
回复:如何确定随机生成的点落在地图上的哪个区域?你需要多少分辨率? 如果 10K x 10K 位图就足够了,并且多边形少于 16E6,您可以将矩形绘制到具有唯一颜色的位图中(2^24 种颜色是 1600 万种颜色),并立即查询一个圆形的 xy 像素。 我做了类似的事情ESP32 时钟中的 JSL BLOB用于时区地图中的 GPS 查找。 就我而言,我采用了我能得到的解决方案,即靠近时区边界的一两英里;我不需要像能够对位图进行运行长度编码以使其适合小型计算机那样的速度。
编辑:显然我做了一个这么大的位图
composition = J( 16000, 30000, 0 );
如果我变大,要么内存不足,要么超过像素限制……我使用 16000 表示 +/- 90 度纬度,30K(不是 32K)表示 +/- 180 度经度。未压缩超过 GB。 您需要一个 PNG 文件,而不是 JPG。 JPG 不会保留颜色。
回复:如何确定随机生成的点落在地图上的哪个区域?因为矩形似乎没有旋转并且没有重叠:
四次检查/循环并始终删除那些不匹配的:
1. 检查所有 x_min 小于点 x 的方块
2.检查所有左边的方格,其中x_max大于点的x
3.检查所有左边的方格,其中y_min小于点的y
4.检查所有左边的正方形,其y_max大于点的y
如果只剩下一个方格,您可以在其中的任何一点停下来。 在 JMP 的情况下,您可以在 Loc() 的帮助下完成此操作。
或者然后循环遍历所有方块的最小值最大值并在您找到类似以下内容的匹配项时中断:
:xmin < x < :xmax & :ymin < y < :ymax
几个可能相关的链接,并有更好的可能解决方案:
https://stackoverflow.com/questions/1897779/test-if-point-is-in-some-rectangle
https://www.reddit.com/r/programming/comments/80dlc/i_have_a_set_of_rectangles_and_need_to_determine/