【发布时间】:2011-11-03 13:18:04
【问题描述】:
我在任何地方都找不到这个答案,希望有人能帮助我。
我有一张图片(全黑),里面有一个白色的通用四边形多边形,以及该多边形对应的 4 个角坐标。
我需要找到一个稍微放大的四边形的角和一个稍微缩小的相同的角(形状必须相同,只是在图像内调整四边形的大小)。
是否有允许我这样做的函数,或者我应该手动计算一些几何?
感谢您的帮助。
【问题讨论】:
我在任何地方都找不到这个答案,希望有人能帮助我。
我有一张图片(全黑),里面有一个白色的通用四边形多边形,以及该多边形对应的 4 个角坐标。
我需要找到一个稍微放大的四边形的角和一个稍微缩小的相同的角(形状必须相同,只是在图像内调整四边形的大小)。
是否有允许我这样做的函数,或者我应该手动计算一些几何?
感谢您的帮助。
【问题讨论】:
考虑多边形的一个顶点 p,它的前任 p1 和后继 p2。
这些点之间的向量是
v1 = p1 - p
v2 = p2 - p
(计算分别针对 x 和 y 坐标进行分量计算)。 在收缩多边形中,顶点 p 沿线移动到 p' 它将向量 v1 和 v2 之间的角度 a 减半。 这个方向的向量w是
w = v1 + v2
而这个方向的单位向量v是
v = w / |w| = (w_x, w_y) / sqrt(w_x*w_x + w_y*w_y)
新的点p'是
p' = p + k * v , i.e. :
p_x' = p_x + k * v_x
p_y' = p_y + k * v_y
其中 k 是移动距离(一个标量)。
如果顶点p是凸的(如图),那么k >= 0表示 收缩和 k = 0 表示 扩大,k
【讨论】:
你想要的是多边形偏移。如果要使用现有库。考虑使用Clipper
void OffsetPolygons(const Polygons &in_polys,
Polygons &out_polys,
double delta,
JoinType jointype = jtSquare, double MiterLimit = 2.0);
此函数将 'polys' 多边形参数偏移 'delta' 量。正增量值扩展外部多边形并收缩内部“洞”多边形。负增量则相反。
虽然我必须添加一个简单的几何图形,例如四边形,但从头开始很容易。
请注意极端情况。当您偏移具有一个非常小的边缘的四边形时。它会在偏移上变成一个三角形。
【讨论】:
我同意parapura rajkumar的回答。我想补充一点,Jiri 的解决方案不是 100% 正确的,因为四边形的顶点质心与四边形的面积质心不同,因为它写成here。对于放大,必须使用区域质心 - 或者更优雅的solution 与parapura rajkumar 提到的平行线。我只想在这个答案中添加以下内容:
您可以通过计算原始四边形点之间的向量的法向量来简单地确定放大四边形的外部点。然后,对法线向量进行归一化,将它们与偏移量相乘,然后将它们添加到原始四边形的点上。鉴于这些外部点,您现在可以计算平行线与此 formula 的交点。
【讨论】: