algorithm - 如何确定标签偏移量以使标签始终位于多边形的外部?
问题描述
我有一些多边形的顶点,上面有标签。我想放置标签,使它们始终位于多边形的外部。所以在上图中,除了#3 和#4 之外,所有标签都很好,我希望它们位于多边形外部的底部。所以一般来说,对于一个特定的顶点,我如何确定如何偏移它以使其位于多边形之外?
解决方案
由于您没有显示任何自己的代码,我将仅陈述一些想法。如果您想要包括代码在内的更多详细信息,请展示您自己的更多努力然后询问。
我在这里假设多边形是一个简单的多边形——一个不与自身相交的多边形。如果一个多边形确实与自身相交,那么它的“内部”的定义就不是那么简单了,并且内部有多个定义。我不会假设多边形是凸的——所有的内角都小于 180°。(这将允许一个更简单的答案。)我还假设您希望标签的中心位于多边形之外,但允许标签的角落或一小部分位于内部。
首先,遍历多边形并找到它的“缠绕角”,即在遍历过程中方向角的变化量。如果多边形很简单,则角度将为 +180° 或 -180°。其中之一意味着您顺时针遍历多边形,另一个意味着逆时针。(这取决于您的坐标系:笛卡尔或图形或其他。)
然后再次遍历多边形。现在您知道多边形的方向,在每个顶点处,您可以找到外角从进入线段顺时针还是逆时针。找到那个方向和角度的大小,然后在那个方向移动那个角度的一半。沿该角度从顶点移动给定距离,您将获得标签中心的位置。
这应该适用于绝大多数多边形。在非凸多边形的某些边缘情况下,该位置从多边形移到多边形的另一部分。然后,您减少标签与其顶点的距离,直到标签移回多边形的外部。
我回答了一个相关问题: 如何有效地确定多边形是凸面、非凸面还是复面?.
推荐阅读
- python - 传递给 Gensim 语言模型的句子迭代器
- graphql - 为什么 TYPE_ADDED_TO_INTERFACE 被认为是一个重大变化?
- typescript - VS Code tsserver 问题匹配器覆盖来自自定义任务问题匹配器的错误
- python-3.x - 如何将硬编码的 youtube-dl 代码和 tkinter 变量传递到命令行
- javascript - 如何获取具有变化值的隐藏元素的文本内容
- angular - Angular 8 使用 HttpInterceptor 添加自定义请求标头
- excel - 在特定条件下在用户窗体中显示消息框
- .htaccess - 如何在不破坏层次结构的情况下重定向?
- java - 问题:java.lang.Integer.parseInt(Unknown Source)
- ruby-on-rails - 如何为仅限 API 的应用创建视频预览