根据密度函数将平面划分为质量相等的区域
Dividing the plane into regions of equal mass based on a density function
给定平面中的 "density" 标量场,我如何将平面划分为良好的(低惯性矩)区域,以便每个区域包含相似数量的 "mass"?
这不是我实际问题的最佳描述,但这是我能想到的最简洁的措辞。
我有一张虚构世界的大地图可用于游戏。我很清楚一个人一天可以从这张地图上的任何给定点大约走多远,这根据地形等有很大差异。我想通过将地图划分为区域来表示这些信息,这样一天的步行可以带你从任何地区到任何邻近地区。它不一定是完美的,但它应该比简单地将地图分成六边形网格(这是许多游戏所做的)要好得多。
我想到我可以创建一个与地图具有相同尺寸的灰度图像,其中每个像素的颜色值表示一个人可以多快穿过地图上同一位置的像素。维护良好的道路将被编码为白色像素,不可逾越的悬崖将被编码为黑色,或类似的东西。
我的问题是:有没有人知道如何使用这样的灰度图像("density" 标量场)从上一段(区域)生成我的 "grid"相似"mass")?
我考虑过使用灰度图像作为离散概率分布,从中我可以生成一堆坐标,然后使用某种聚类算法来创建区域,但是 a) 聚类我认为算法必须创建类似大小的集群才能使这个想法起作用,我认为他们通常不会这样做,并且 b) 我几乎不知道其中任何一个是否有意义,因为我离开我的舒适区。
抱歉,如果这不属于这里,我的想法一直是以某种方式以某种方式解决它,所以这似乎是最明智的地方。
更新: 只是想分享我到目前为止得到的结果,尝试@建议的第二种方法samgak - 递归地将区域细分为质量相似的框,找到每个区域的质心,并从中创建一个 voronoi 图。
我会继续调整,也许会尝试找到一种方法让它不那么像网格(比如在右上角),但这比我预期的要好!
一些粗略的想法:
您或许可以根据这些点重新利用 color-quantization algorithm, which partitions color-space into regions with roughly the same number of pixels in them. You would have to do some kind of funny mapping where the darker the pixel in your map, the greater the number of pixels of a color corresponding to that pixel's location you create in a temporary image. Then you quantize that image into x number of colors and use their color values as co-ordinates for the centers of the regions in your map, and you could then create a voronoi diagram 来定义您的区域边界。
另一种方法(类似于某些颜色量化算法在幕后的工作方式)可能是通过选取每个矩形区域并选择最佳分割线 (x或 y) 和位置以创建 2 个类似 "mass" 的较小矩形。您最终会得到 2 个矩形区域的幂,并且您可以通过获取每个矩形的质心(不仅仅是边界框的中心)并从所有中心创建一个 voronoi 图来消除块效应-点。这不能保证创建质量完全相等的区域,但它们应该大致相等。该算法可以通过允许沿任意方向(或者可能是有限数量的 8、16、32 等可能方向)的线进行递归拆分来改进,但这当然会使它变得更加复杂。
在@samgak 的解决方案的基础上,如果您不想要类似网格的结构,您可以向您的中心添加一个小的随机扰动。例如,您可以在下面看到我获得的差异:
无扰动
添加一些随机扰动
给定平面中的 "density" 标量场,我如何将平面划分为良好的(低惯性矩)区域,以便每个区域包含相似数量的 "mass"?
这不是我实际问题的最佳描述,但这是我能想到的最简洁的措辞。
我有一张虚构世界的大地图可用于游戏。我很清楚一个人一天可以从这张地图上的任何给定点大约走多远,这根据地形等有很大差异。我想通过将地图划分为区域来表示这些信息,这样一天的步行可以带你从任何地区到任何邻近地区。它不一定是完美的,但它应该比简单地将地图分成六边形网格(这是许多游戏所做的)要好得多。
我想到我可以创建一个与地图具有相同尺寸的灰度图像,其中每个像素的颜色值表示一个人可以多快穿过地图上同一位置的像素。维护良好的道路将被编码为白色像素,不可逾越的悬崖将被编码为黑色,或类似的东西。
我的问题是:有没有人知道如何使用这样的灰度图像("density" 标量场)从上一段(区域)生成我的 "grid"相似"mass")?
我考虑过使用灰度图像作为离散概率分布,从中我可以生成一堆坐标,然后使用某种聚类算法来创建区域,但是 a) 聚类我认为算法必须创建类似大小的集群才能使这个想法起作用,我认为他们通常不会这样做,并且 b) 我几乎不知道其中任何一个是否有意义,因为我离开我的舒适区。
抱歉,如果这不属于这里,我的想法一直是以某种方式以某种方式解决它,所以这似乎是最明智的地方。
更新: 只是想分享我到目前为止得到的结果,尝试@建议的第二种方法samgak - 递归地将区域细分为质量相似的框,找到每个区域的质心,并从中创建一个 voronoi 图。
我会继续调整,也许会尝试找到一种方法让它不那么像网格(比如在右上角),但这比我预期的要好!
一些粗略的想法:
您或许可以根据这些点重新利用 color-quantization algorithm, which partitions color-space into regions with roughly the same number of pixels in them. You would have to do some kind of funny mapping where the darker the pixel in your map, the greater the number of pixels of a color corresponding to that pixel's location you create in a temporary image. Then you quantize that image into x number of colors and use their color values as co-ordinates for the centers of the regions in your map, and you could then create a voronoi diagram 来定义您的区域边界。
另一种方法(类似于某些颜色量化算法在幕后的工作方式)可能是通过选取每个矩形区域并选择最佳分割线 (x或 y) 和位置以创建 2 个类似 "mass" 的较小矩形。您最终会得到 2 个矩形区域的幂,并且您可以通过获取每个矩形的质心(不仅仅是边界框的中心)并从所有中心创建一个 voronoi 图来消除块效应-点。这不能保证创建质量完全相等的区域,但它们应该大致相等。该算法可以通过允许沿任意方向(或者可能是有限数量的 8、16、32 等可能方向)的线进行递归拆分来改进,但这当然会使它变得更加复杂。
在@samgak 的解决方案的基础上,如果您不想要类似网格的结构,您可以向您的中心添加一个小的随机扰动。例如,您可以在下面看到我获得的差异:
无扰动
添加一些随机扰动