缩放任意多边形

9
我已经在互联网上搜寻了很多天,但一直没有找到一个好的答案(或者至少能让我理解的答案)来回答一个看起来应该是一个常见问题。如何缩放任意多边形?特别是凹多边形。我需要一个可以处理凹多边形(肯定的)和自相交(如果可能的话)的算法。显然,我已经使用了简单明了的算法来处理简单的凸多边形,它计算了多边形的质心,将其平移至原点,缩放所有顶点,并将多边形平移到其原始位置。
这种方法对于许多(或者可能是所有)凹多边形都不起作用,因为质心经常落在多边形外部,因此缩放操作也会导致平移。我需要能够在不平移最终结果的情况下“原地”缩放多边形。
有人知道一种缩放凹多边形的方法吗?或者有没有办法找到可以用作缩放操作参考框架的“视觉中心”?
只是为了澄清,我正在二维空间中工作,我想使用“视觉中心”作为缩放多边形的参考框架。所以另外一个问问题的方式可能是,如何找到凹和/或自相交多边形的视觉中心?
谢谢!

嗯,我尝试使用边界框的中心作为参考框架,但结果也被翻译了。我还尝试将边界框按所需因子进行缩放,并使用边缘作为参考框架,但仍然没有得到纯未翻译的解决方案。你有什么特定的想法,我应该用边界框尝试什么吗?感谢回复! - Craig
绘制一个凹多边形并标注您所指的“视觉中心”。视觉中心不是技术术语,我们无法知道您的意思,除非给出精确的定义或至少一些示例,以便我们可以推断出其中一个。 - tskuzzy
听起来你对中心的概念有些困惑。你的精确应用是什么?重心有什么问题吗?如果在凹多边形的情况下,“中心”不在多边形内部,我不明白为什么会有问题。请画一张图,展示:“这个是重心,但我需要这个点在变换下保持不变”。 - Szabolcs
@Craig 好的,我明白了。那你认为这个图形的“视觉中心”在哪里?http://i.imgur.com/gE2MR.png 你为什么需要点在多边形内部呢? - Szabolcs
1
可能是膨胀/缩小(偏移,缓冲)多边形的算法的重复问题。 - user276648
显示剩余4条评论
3个回答

6

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

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

如果我没错的话,只需编写变换矩阵:

然后用矩阵转换您的多边形

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

希望有所帮助


编辑

如果你想保持相同的“中心”,只需使用参数lambda的同形变换,中心为多边形的重心G:

它满足:
enter image description here

G不会移动,因为它是同形变换的中心。

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

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

这应该是你所需要的。


4
也许Craig正在寻找“多边形偏移”算法——其中多边形中的每条边都会偏移一个给定的值。例如,对于一个顺时针方向的多边形,向左偏移边缘将增加多边形的大小。如果这就是Craig所寻找的内容,那么此前已经有人在这里提出并回答了这个问题:“膨胀/收缩(偏移、缓冲)多边形”的算法
如果你正在寻找现成的(开源免费)解决方案,我还创建了一个剪裁库(Clipper),它使用Delphi、C++和C#编写,包括一个相当简单的多边形偏移函数。

1
小互联网哈,我目前正在使用Clipper进行这个项目,甚至在sourceforge论坛上为该项目发布了几次 :-). 我认为我只是期望一个偏移类似的行为(多边形在原地增长/缩小)从一个比例操作(使用因子而不是单位偏移)... 再次感谢Clipper库,它已经被证明非常有用! - Craig

1
你找不到一个好的答案的原因是因为你对需求不够明确。首先要明确定义“原地”是什么意思。哪些内容是被保持不变的?
一旦你弄清楚了这一点,就将常量点转换为原点,按照通常的方式缩放多边形,然后再转换回去。

我的“原地”概念是在原始多边形和缩放后的多边形之间保持“视觉中心”不变。我不确定如何找到凹多边形的视觉中心,或者尝试找到/定义“视觉中心”是否是正确的方法。 - Craig
你能否发布一些使用质心不起作用的情况下的案例图片? - tskuzzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接