find不规则形状多边形的“视觉”中心的最快方法是什么?
我需要find一个点,这是一个不规则形状的多边形的视觉中心。 视觉中心,我的意思是一个点,似乎是在视觉的多边形的大面积的中心。 应用程序是在多边形内放置一个标签。
这是一个使用内部缓冲的解决scheme:
https://web.archive.org/web/20150708063910/http://proceedings.esri.com/library/userconf/proc01/professional/papers/pap388/p388.htm
如果这是要使用的,那么寻找缓冲区的有效和快速的方法是什么? 如果要使用其他方式,那是这样吗?
一个真正强硬的多边形的一个很好的例子是一个巨大的厚U(用Arial Black或Impact或其他字体书写)。
如果可以将多边形转换为二进制图像,那么可以使用image processing领域中存在的基础,例如: 一个块表示二值图像的快速骨架algorithm 。
但是在一般情况下,这是不合理的,因为离散化错误和额外的工作。
但是,也许你会发现这些有用的:
- 一个简单的多边形的直骨架
- (几乎)线性时间确定一个简单多边形的骨架
编辑:也许你想要找的是多边形中包含的最大的圆的中心点。 它不一定总是在观察中心,但大部分时间可能会给出预期的结果,只有在轻微的病理情况下,这是完全closures的。
怎么样:
如果多边形的质心位于多边形内,则使用它,否则:
1)从质心通过将多边形分成相等面积的两半的多边形展开一条线
2)“视觉中心”是线条接触周边的最近点与下一个点之间的中点,沿着远离质心的方向切割周边
这里有几张图片来说明它:
我从MapBox中find了一个非常好的解决scheme,叫做Polylabel 。 完整的源代码也可以在他们的Github上find 。
本质上,它试图findT奥斯汀所说的多边形的视觉中心。
有关使用情况的快速说明。 这个源代码非常适用于Javascript,但是如果你打算在“普通”多边形中使用它,那么你应该把它包装在一个空的数组中,因为这里的函数使用GeoJSONPolygons而不是普通的多边形,
var myPolygon = [[x1, y1], [x2, y2], [x3, y3]]; var center = polylabel([myPolygon]);
质心法已经被多次提出。 我认为这是一个很好的资源,非常直观地描述了这个过程(以及其他很多有用的多边形技巧):
geometry/polygonmesh/centroid.pdf
另外,为了放置一个简单的UI标签,计算多边形的边界框(由多边形中任何顶点的最低和最高的x和y坐标定义的矩形)就足够了,
{ x = min_x + (max_x - min_x)/2, y = min_y + (max_y - min_y)/2 }
这比计算质心要快一些,这对实时或embedded式应用来说可能是重要的。
还要注意,如果你的多边形是静态的(它们不改变forms),你可以通过将BB中心/质心计算结果(相对于例如多边形的第一个顶点)保存到数据结构多边形。
计算多边形每个边的中心位置(x,y)。 您可以通过查找每个边的末端位置之间的差异来执行此操作。 取每个维度的每个中心的平均值。 这将是多边形的中心。
我不是说这是最快的,但它会给你多边形内的一个点。 计算直骨架 。 你正在寻找的是这个骨架。 例如,您可以select与边界框中心距离最短的那个。
如何find多边形(内部最大的圆)的“圆”(inircle),然后将标签置于中心? 这里有几个链接让你开始:
http://www.mathopenref.com/polygonincircle.html
https://nrich.maths.org/discus/messages/145082/144373.html?1219439473
这很可能在每个多边形上都不能很好地工作。 一个看起来像C的多边形会使标签处于某种不可预测的地步。 但优点是标签总是与多边形的实体部分重叠。
如果我理解了你所关联的论文的重点(相当有趣的问题,顺便说一句),这种“内部缓冲”技术有点类似于从边缘的酸溶解糖(例如,随着缓冲距离的增加,原始形状的更less)最后剩下的位是放置标签的理想位置。
如何在一个algorithm中完成这个不幸的是我不是很清楚….
我想如果你把多边形折回到它的顶点,然后应用一个函数来find最大的凸包,然后find那个凸包的中心,它将与“明显的”中心紧密匹配。
查找给定顶点的最大凸包: 查看简单多边形的段落。
平均凸包的顶点以find中心。
您可以将标签放置在边界框的天真中心(也许是),然后根据本地多边形边和标签BB的交点来移动标签吗? 沿着相交边缘的法线移动,如果有多条边相交,则将它们的法线相加以便移动?
只是猜测在这里; 在这类问题中,只要性能不是太大的问题,我可能会尝试迭代求解。
现在没有太多的时间去详细说明或者testing,但是当我有机会的时候,我会尽力做更多的事情。
使用质心作为主要方法。 testing以确定质心是否在多边形内; 如果没有,则通过最近的点画出一条直线到另一边。 在多边形内该行的中间点放置标签。
因为离质心最近的点很可能会限制在相当大的范围内,所以我认为这可能会给Kyralessa的内含物带来类似的结果。 当然,如果你有一个带孔的多边形,这可能会疯狂。 在这种情况下,这个圈子可能会好很多。 另一方面,对于典型情况,它默认为(快速?)质心方法。
这个问题可能类似于find密度均匀的“质心”。
编辑:如果多边形有“洞”,这种方法将无法正常工作
您可以使用在土木工程中使用的质量中心(或重心)方法,这里是从维基百科有用的链接: