我需要找到一个点,是一些中心的形状不规则的多边形。通过视觉中,我的意思是这一点似乎是,在中心的一个大面积的面视觉上的。该应用程序是把标签内部多边形。

这里是一个解决方案,使用内部缓冲:

https://web.archive.org/web/20150708063910/http://proceedings.esri.com/library/userconf/proc01/professional/papers/pap388/p388.htm

如果这是可以使用的,什么是有效和快速的方式找到缓冲器?如果任何其他方式是可以使用,这是这样的吗?

一个很好的例子真的很难面是一个巨大厚U(写入在黑或影响或一些这样的字体).

有帮助吗?

解决方案

如果你可以转换的多边形成的二进制的图像,然后可以使用的基础存在于图像处理领域,例如: 一个快速的骨架的算法 在方框表示的二进制的图像.

但这不是真的在合理的一般情况下,因为离散的错误的和额外的工作。

然而,也许你能找到这些有用的:

编辑:也许你想要看看点,是中心的最大的圈子中所含的多边形。它不一定总是在观察中心,但大多数时候可能会得到预期的结果,并且只有在轻微的病理情况下的东西,是完全关闭。

其他提示

我从MapBox中找到了一个非常好的解决方案,名为 Polylabel 。完整的资源也可以在 Github 上找到。

基本上它试图找到多边形的视觉中心,如T Austin所说。

某些细节表明这可能是一个切实可行的解决方案:

  

不幸的是,计算[理想解决方案]既复杂又困难   而且很慢。已公布的问题解决方案也需要   受约束的Delaunay三角剖分或计算直骨架为   预处理步骤 — 这两个步骤都很慢且容易出错。

     

对于我们的用例,我们不需要确切的解决方案 ————我们愿意   交易一些精度以获得更快的速度。当我们在上面贴上标签时   一张地图,它以毫秒计算比它更重要   在数学上是完美的。

关于使用情况的快速说明。源代码适用于开箱即用的Javascript,但是如果您打算使用“正常”和“正常”的那么你应该将它包装在一个空数组中,因为这里的函数需要 GeoJSONPolygons 而不是正常多边形即

var myPolygon = [[x1, y1], [x2, y2], [x3, y3]];
var center = polylabel([myPolygon]);

怎么样:

如果多边形的质心在多边形内,则使用它,否则:

1)从质心通过多边形延伸一条线,将多边形分成两半相等的区域

2)“视觉中心”。是在线接触周边的最近点和在远离质心的方向上切割周边的下一个点之间的中间点

以下是一些图片来说明:

计算多边形每条边的中心位置(x,y)。您可以通过查找每条边的末端位置之间的差异来实现此目的。取每个维度中每个中心的平均值。这将是多边形的中心。

已经多次提出了质心方法。我认为这是一个很好的资源,非常直观地描述了这个过程(以及许多其他有用的多边形技巧):

http://paulbourke.net/geometry/polygonmesh/centroid.pdf

此外,为了放置一个简单的UI标签,仅计算多边形的边界框(由多边形中任何顶点的最低和最高x和y坐标定义的矩形)并获得其中心可能就足够了于:

{
    x = min_x + (max_x - min_x)/2,
    y = min_y + (max_y - min_y)/2
}

这比计算质心要快一些,这对于实时或嵌入式应用程序来说可能很重要。

另请注意,如果您的多边形是静态的(它们不会改变形状),您可以通过将BB中心/质心计算的结果(相对于例如多边形的第一个顶点)保存到多边形的数据结构。

我并不是说这是最快的,但它会在多边形内部给你一个点。计算 Straight Skeleton 。你正在寻找的是这个骨架。例如,您可以选择距离边界框中心的最短法线距离的那个。

找到“incircle”怎么样?多边形(适合其内部的最大圆圈),然后将标签居中于其中心?以下是一些可以帮助您入门的链接:

http://www.mathopenref.com/polygonincircle.html
https://nrich.maths.org/discus/messages/145082/ 144373.html?1219439473

这很不可能完美地适用于每个多边形;看起来像C的多边形会使标签处于某种不可预测的位置。但优点是标签总是与多边形的实体部分重叠。

如果我理解你所链接的论文的意思(非常有趣的问题,顺便说一下),这就是“内部缓冲”。技术有点类似于用一块糖从边缘用酸溶解来模拟所讨论的形状。(例如当缓冲距离增加时,剩下的原始形状减少)剩下的最后一点是理想的贴上标签。

遗憾的是,如何在算法中完成此操作并不是很清楚....

我认为如果你将多边形折回到它的顶点,然后应用一个函数来找到最大的凸包,然后找到该凸包的中心,那么它将与“明显的”相匹配。中心。

在给定顶点的情况下找到最大的凸包:查看简单多边形段落。

平均凸包的顶点以找到中心。

你可以将标签放在天然中心(可能是边界框),然后根据局部多边形边和标签BB的交点移动它吗?沿着交叉边的法线移动,如果多个边相交,则将它们的法线相加以进行移动?

在这里猜测;在这类问题中,我可能会尝试迭代地解决,只要性能不是太大的问题。

现在没有太多时间详细说明或测试,但是当我有机会时,我会尝试做更多的事情。

使用质心作为主要方法。测试质心是否在多边形内;如果没有,则在的最近点和多边形的另一边画一条线。在多边形内该线段的中点处,放置标签。

因为离质心最近的点很可能会限制一个相当大的区域,我认为这可能会产生类似于Kyralessa's incircles的结果。当然,如果你有一个带孔的多边形,这可能会发狂。在这种情况下,收视率可能会好得多。另一方面,对于典型情况,它默认为(快速?)质心方法。

这个问题可能类似于找到“质心”。假设密度均匀。

编辑:如果多边形具有“孔”

,则此方法将不起作用

你可以使用土木工程中使用的质心(或重心)方法,这里有一个来自维基百科的有用链接:

http://en.wikipedia.org/wiki/Center_of_mass

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top