首先我要定义:
我有一张地图。实际上是世界地图。我想把它分成小区域。区域的大小将取决于区域所在的区域。例如,对于欧洲来说非常小(可能欧洲将有200个区域),但只有几个大区域用于大西洋。
我可以手动创建点来封闭一个区域。我将为每个大空间创建区域,我希望它具有与其他空间不同的大小。例如,我将为欧洲创建一个封闭区域。所以我得到了一个(纬度,经度)点,定义了欧洲地区的极限。形状当然不规则,中间有洞(我不想在地中海上创造小区域,而是一个大区域)。所以我们得到的是一个巨大的2D形状,可以填充区域。
区域本身是n大小的多边形,大小的数量可以随机选择或受其他约束。每个区域的区域也是随机限制的(例如50加/减40%),尽管这个约束可以再次放宽(例外,不作为规则)。区域不能重叠,整个区域必须分开。
显而易见的问题,任何看起来像这样的算法都可以用来解决这个问题? 我甚至有问题要确定给定点是在封闭区域内还是在封闭区域之外。
答案 0 :(得分:2)
我,我会反过来做,在所有区域的(近似)中心放一个点并计算结果点集的Voronoi Diagram。
编辑:以回应@Unreason的评论。我并不是说计算Voronoi图是对问题的答案。我确实声称计算Voronoi图是一种合适的方法,用于将平面地图划分为区域,这些区域由它们与点的接近度来定义。这可能会,也可能不会满足OP的基本要求,OP可以自由使用或忽略我的建议。
我暗示了以下内容,但现在将明确说明:OP,如果采用此建议,应在每个所需区域的“中心”定义点(纬度,长度)并运行算法。 Voronoi图不是迭代计算的,如果OP不喜欢解,那么OP必须移动点并重新计算。我想编写一个例程可以做到这一点;与计算制图一样,困难的部分在于定义一个关于试验解决方案符合(准)美学要求的可计算规则。
我不打扰,我会使用国家首都城市作为我的区域的点(在欧洲相对密集,在大西洋相对稀疏)并让算法运行。任务完成。
也许OP可能会使用人口超过5 x 10 ^ 5的所有城市的位置(欧洲大概有200个)。或者其他一些观点。
哦,计算Voronoi图也不是随机的,它完全是确定性的。同样,这可能满足也可能不满足基本要求。
答案 1 :(得分:0)
要确定某个点是否位于多边形内,请按照维基百科中的point in polygon进行操作,或使用某个几何框架。
将多边形划分为松散相同大小的较小多边形的限制根本不是很有限,例如,如果你
切割大的多边形,垂直和水平线间隔开,这样在陆地上你就会得到完全符合目标的大小,然后对于欧洲来说,你将满足大多数区域的标准。
检查所有这些并且对于那些不符合标准的那些,您可以开始修改相邻区域的边界,以达到所需的大小(因为你有+/- 40%这不应该是硬)。
您可以通过移动共享节点或向边框添加点并仅移动这些线来完成此操作。
此外,在上述之前,从初始切割开始加入小于某个百分比的区域(例如目标大小的20%;这些区域可能是岛屿和其他小块)。
该算法适用于大量小区域,但对于只需要切割成几个区域的区域(但它可以工作)也不会有效。