【问题标题】:Scaling an arbitrary polygon缩放任意多边形
【发布时间】:2011-10-13 09:57:36
【问题描述】:

我已经在互联网上搜索了好几天,但是对于这似乎应该是一个常见问题的问题,我一直找不到一个好的答案(或者至少是一个对我有意义的答案)。如何缩放任意多边形?特别是凹多边形。我需要一种可以处理凹面(肯定)和自相交(如果可能)多边形的算法。我用来处理简单凸多边形的明显而简单的算法是计算多边形的质心,将该质心平移到原点,缩放所有顶点,并将多边形平移回其原始位置。

这种方法不适用于许多(或可能所有)凹多边形,因为质心通常位于多边形之外,因此缩放操作也会导致平移,我需要能够“原地”缩放多边形而不正在翻译的最终结果。

有人知道缩放凹多边形的方法吗?或者也许是一种找到“视觉中心”的方法,可以用作缩放操作的参考框架?

澄清一下,我在 2D 空间中工作,我想使用“视觉中心”作为参考框架来缩放我的多边形。所以也许另一种提问方式是,我如何找到凹面和/或自相交多边形的视觉中心?

谢谢!

【问题讨论】:

  • 也许可以构建一个人工边界矩形(或其他区域)来帮助您进行居中和平移。
  • 嗯,我尝试使用边界框的中心作为参考框架,但结果也被翻译了。还尝试按所需因子缩放边界框并使用边缘作为参考框架,但仍然没有得到纯未翻译的解决方案。你有什么特别的想法我应该尝试使用边界框吗?感谢您的回复!
  • 我所说的中心是多边形的“视觉中心”。我能想到的描述它的最佳方式是“放大”多边形,因此您希望多边形的视觉中心在整个缩放过程​​中保持不变。
  • 画一个凹多边形并标注你所说的“视觉中心”。视觉中心不是一个技术术语,如果不给出精确的定义或至少一些示例,我们就无法知道您的意思,以便我们可以推断。

标签: algorithm polygon concave


【解决方案1】:

我不确定你的问题是什么。

您在仿射空间中工作,并且正在寻找仿射变换来缩放多边形?

如果我是对的,就写转换矩阵:

然后用矩阵变换你的多边形

您可以查找仿射变换矩阵。

希望对你有帮助


编辑

如果你想保持相同的“中心”,你可以用中心 G = 多边形的重心做一个参数 lambda 的同义:

它会验证:

G 不会移动,因为它是同类的中心。

它仍然会验证下面的关系,所以它仍然是重心。 (只需将关系乘以 lambda)

在您的情况下,G 很容易确定:G(x,y) :(点的 x 值的平均值,点的 y 值的平均值)

它应该做你需要的

【讨论】:

    【解决方案2】:

    您找不到好的答案的原因是您的要求不够精确。首先明确定义“就地”的含义。什么保持不变?

    一旦你弄清楚了,然后将常量点平移到原点,像往常一样缩放多边形,然后平移回来。

    【讨论】:

    • 我的想法是“视觉中心”在原始多边形和缩放多边形之间保持不变。我不知道如何去寻找凹多边形的视觉中心,或者如果沿着试图找到/定义“视觉中心”的道路走下去是正确的方法。
    • 您能否发布一些使用质心效果不佳的案例图片?
    【解决方案3】:

    也许 Craig 正在寻找一种“多边形偏移”算法 - 多边形中的每条边都偏移给定值。例如,给定一个顺时针方向的多边形,向左偏移边会增加多边形的大小。如果这是 Craig 正在寻找的东西,那么在此之前已经提出并回答了这个问题 - An algorithm for inflating/deflating (offsetting, buffering) polygons

    如果您正在寻找现成的(开源免费软件)解决方案,我还创建了一个用 Delphi、C++ 和 C# 编写的剪辑库 (Clipper),其中包括一个相当简单的多边形偏移功能。

    【讨论】:

    • 小型互联网哈,我目前正在为这个项目使用 Clipper,甚至在该项目的 sourceforge 论坛上发布了几次 :-)。我想我只是期待从类似比例的操作(使用因子而不是单位偏移量)中出现类似偏移的行为(多边形“原地”增长/收缩)......再次感谢 Clipper 库,它有事实证明非常有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2010-11-26
    相关资源
    最近更新 更多