我已经在互联网上搜索了好几天,但一直无法找到一个好的答案(或至少一个对我有意义的答案)似乎应该是一个常见的问题。如何缩放任意多边形?特别是凹多边形。我需要一种能够处理凹(绝对)和自相交(如果可能)多边形的算法。我用来处理简单凸多边形的明显而简单的算法是计算多边形的质心,将该质心平移到原点,缩放所有顶点,并将多边形平移回原始位置。
这种方法不适用于许多(或者全部)凹面多边形,因为质心经常落在多边形之外,因此缩放操作也会导致平移,我需要能够“就地”缩放多边形而不需要最终的结果正在被翻译。
有人知道缩放凹多边形的方法吗?或者也许找到“视觉中心”的方法,它可以用作缩放操作的参考框架?
为了澄清,我正在2D空间工作,我想使用“视觉中心”作为参考框架来缩放我的多边形。所以也许另一种提问的方法是,如何找到凹面和/或自相交多边形的视觉中心?
谢谢!
答案 0 :(得分:5)
我不确定你的问题是什么。
你在仿射空间工作,你正在寻找一个仿射变换来扩展你的多边形?
如果我是对的,只需写下转换矩阵:
用矩阵
转换多边形您可以查找仿射变换矩阵。
希望有所帮助
修改强>
如果你想保持相同的“中心”,你可以做一个参数lambda的中心G =多边形的重心:
验证:
G不会移动,因为它是homotethy的中心。
它仍然会验证下面的关系,所以它仍然是重心。 (你只需将关系乘以lambda)
在你的情况下G很容易确定:G(x,y):(点的x值的平均值,点的y值的平均值)
它应该做你需要的
答案 1 :(得分:3)
也许Craig正在寻找一种“多边形偏移”算法 - 其中多边形中的每条边都偏移给定值。例如,给定顺时针方向的多边形,向左偏移边缘将增加多边形的大小。如果这正是克雷格所寻求的,那么这里已经提出并回答了这个问题 - An algorithm for inflating/deflating (offsetting, buffering) polygons。
如果您正在寻找现成的(opensource免费软件)解决方案,我还创建了一个用Delphi,C ++和C#编写的剪辑库(Clipper),其中包含一个相当简单的多边形偏移函数。 / p>
答案 2 :(得分:1)
你无法找到一个好答案的原因是因为你的要求不精确。首先明确定义“就地”的含义。什么是不变的?
一旦你想出来,然后将常数点转换为原点,像往常一样缩放多边形,并转回。