Algorithm 如何确定标签偏移,使标签始终位于多边形的外侧?

Algorithm 如何确定标签偏移,使标签始终位于多边形的外侧?,algorithm,math,geometry,computational-geometry,Algorithm,Math,Geometry,Computational Geometry,我有一些多边形的顶点,上面有标签。我希望放置标签,使其始终位于多边形的外侧。因此,在上图中,除了#3和#4之外,所有标签都很好,我希望它们位于底部,多边形之外。所以一般来说,对于一个特定的顶点,我如何确定它的偏移量,使它位于多边形之外 由于您没有显示自己的任何代码,因此我将仅陈述一些想法。如果你想要更多的细节,包括代码,展示你自己的更多努力,然后询问 在这里,我假设多边形是一个简单的多边形——一个不与自身相交的多边形。如果多边形与自身相交,则其“内部”的定义就不那么简单,内部有多个定义。我不会假


我有一些多边形的顶点,上面有标签。我希望放置标签,使其始终位于多边形的外侧。因此,在上图中,除了#3和#4之外,所有标签都很好,我希望它们位于底部,多边形之外。所以一般来说,对于一个特定的顶点,我如何确定它的偏移量,使它位于多边形之外

由于您没有显示自己的任何代码,因此我将仅陈述一些想法。如果你想要更多的细节,包括代码,展示你自己的更多努力,然后询问

在这里,我假设多边形是一个简单的多边形——一个不与自身相交的多边形。如果多边形与自身相交,则其“内部”的定义就不那么简单,内部有多个定义。我不会假设多边形是凸的——所有内角都小于180°。(这将使答案更简单。)我还假设您希望标签的中心位于多边形之外,但允许标签的一角或一小部分位于多边形内部

首先,遍历多边形并找到其“缠绕角度”,即在遍历过程中方向角度的变化量。如果多边形很简单,则角度将为+180°或-180°。其中一个表示顺时针遍历多边形,另一个表示逆时针。(这取决于您的坐标系:笛卡尔坐标系、图形或其他坐标系。)

然后再次遍历多边形。现在您知道了多边形的方向,在每个顶点上,您可以找到外部角度是从输入段顺时针还是逆时针方向。找到该方向和角度的大小,然后在该方向上移动该角度的一半。沿该角度从顶点移动给定的距离,即可获得标签中心的位置

这对绝大多数多边形来说应该很有效。在非凸多边形的某些边情况下,该位置从多边形移动到多边形的另一部分。然后减小标签与其顶点之间的距离,直到标签移回多边形的外部


我回答了一个相关的问题:。

由于您没有显示自己的任何代码,因此我将陈述一些想法。如果你想要更多的细节,包括代码,展示你自己的更多努力,然后询问

在这里,我假设多边形是一个简单的多边形——一个不与自身相交的多边形。如果多边形与自身相交,则其“内部”的定义就不那么简单,内部有多个定义。我不会假设多边形是凸的——所有内角都小于180°。(这将使答案更简单。)我还假设您希望标签的中心位于多边形之外,但允许标签的一角或一小部分位于多边形内部

首先,遍历多边形并找到其“缠绕角度”,即在遍历过程中方向角度的变化量。如果多边形很简单,则角度将为+180°或-180°。其中一个表示顺时针遍历多边形,另一个表示逆时针。(这取决于您的坐标系:笛卡尔坐标系、图形或其他坐标系。)

然后再次遍历多边形。现在您知道了多边形的方向,在每个顶点上,您可以找到外部角度是从输入段顺时针还是逆时针方向。找到该方向和角度的大小,然后在该方向上移动该角度的一半。沿该角度从顶点移动给定的距离,即可获得标签中心的位置

这对绝大多数多边形来说应该很有效。在非凸多边形的某些边情况下,该位置从多边形移动到多边形的另一部分。然后减小标签与其顶点之间的距离,直到标签移回多边形的外部


我回答了一个相关的问题:。

在每个顶点上,传入边和传出边形成一个覆盖某个扇区的角度。可以沿此角度的平分线将标签放置在一定距离处。通过在边的方向上添加两个源自顶点的单位向量,可以找到平分线的方向向量

找到正确的平分线侧需要小心。首先,您需要确定多边形的方向,即检查多边形是顺时针还是逆时针。这只需使用鞋带公式计算面积并测试符号即可完成


然后,如果我是对的,你可以测试由两条边组成的三角形的面积,并将其符号与整个多边形的符号进行比较。这告诉你角度是凸的还是反射的,你知道正确的边。对于凸多边形,如上所述计算的向量的边总是负值。

在每个顶点上,传入和传出边形成一个覆盖某个扇区的角度。可以沿此角度的平分线将标签放置在一定距离处。通过在边的方向上添加两个源自顶点的单位向量,可以找到平分线的方向向量

找到正确的平分线侧需要小心。首先,您需要确定多边形的方向,即检查多边形是顺时针还是逆时针。这只需使用鞋带公式计算面积并测试符号即可完成


然后,如果我是对的,你可以测试由两条边组成的三角形的面积,并将其符号与整个多边形的符号进行比较。这告诉你角度是凸的还是反射的,你知道正确的边。对于凸多边形,如上所述计算的向量的边始终为负值。

可能遵循如下操作:首先,确保多边形不自相交,请参见前面的答案。然后,让多边形反向计时