最适合四边形的正方形

时间:2012-03-08 11:22:28

标签: geometry shapes physics-engine

我有一个由四个点组成的形状,A,B,C和D,其中唯一的位置是已知的。目标是将这些点转换为相对于彼此具有特定角度和偏移。

例如:A(-1,-1) B(2,-1) C(1,1) D(-2,1),应转换为完美的正方形(所有角度90),AB,BC,CD和AD之间的偏移均为2.结果应为逆时针稍微旋转的正方形

最有效的方法是什么? 我正在使用它来进行简单的块模拟程序。

2 个答案:

答案 0 :(得分:1)

正如马克提到的,我们可以使用约束优化来找到边2平方,它最小化了到原始角落的距离的平方。

我们需要最小化f = (a-A)^2 + (b-B)^2 + (c-C)^2 + (d-D)^2(其中正方形实际上是矢量参数与自身的点积)受到一些约束。

按照Lagrange multipliers的方法,我选择了以下距离约束:

g1 = (a-b)^2 - 4
g2 = (c-b)^2 - 4
g3 = (d-c)^2 - 4

以及以下角度约束:

g4 = (b-a).(c-b)
g5 = (c-b).(d-c)

快速的餐巾纸草图应该说服你这些限制就足够了。

然后我们希望最小化f,使得g全部为零。

拉格朗日函数是:

L = f + Sum(i = 1至5,li gi)

其中li是拉格朗日乘数。

渐变是非线性的,因此我们必须使用粗体并使用multivariate Newton's method迭代求解。

这是我得到的数据(红色)给出的数据(黑色):

Best fit square

这需要5次迭代,之后步骤的L2范数为6.5106e-9。

答案 1 :(得分:0)

虽然 Codie CodeMonkey 的解决方案是一个完全有效的解决方案(并且是拉格朗日乘数的一个很好的用例),但我相信值得一提的是,如果 边长没有给出 这个特殊问题实际上有一个封闭形式的解决方案

我们希望最小化拟合正方形的角与给定四边形的角之间的距离。这相当于最小化成本函数:

f(x1,...,y4) = (x1-ax)^2+(y1-ay)^2 + (x2-bx)^2+(y2-by)^2 +
                (x3-cx)^2+(y3-cy)^2 + (x4-dx)^2+(y4-dy)^2

其中 Pi = (xi,yi) 是拟合正方形的角,A = (ax,ay)D = (dx,dy) 表示四边形的给定角按顺时针顺序。由于我们正在拟合一个正方形,因此我们对四个角的位置有一定的限制。实际上,如果给出两个对角,它们就足以描述一个独特的正方形(除了对角线上的镜像)。

Parametrization of the points

这意味着两个对角足以代表我们的目标正方形。我们可以使用前两个角的分量来参数化剩下的两个角。在上面的例子中,我们用 P2P4 表示 P1 = (x1,y1)P3 = (x3,y3)。如果您需要对正方形参数化背后的几何直觉进行可视化,您可以玩 with the interactive version

P2 = (x2,y2) = ( (x1+x3-y3+y1)/2 , (y1+y3-x1+x3)/2 )
P4 = (x4,y4) = ( (x1+x3+y3-y1)/2 , (y1+y3+x1-x3)/2 )

替换 x2,x4,y2,y4 意味着 f(x1,...,y4) 可以重写为:

f(x1,x3,y1,y3) = (x1-ax)^2+(y1-ay)^2 + ((x1+x3-y3+y1)/2-bx)^2+((y1+y3-x1+x3)/2-by)^2 + 
                (x3-cx)^2+(y3-cy)^2 + ((x1+x3+y3-y1)/2-dx)^2+((y1+y3+x1-x3)/2-dy)^2

一个只依赖于 x1,x3,y1,y3 的函数。为了找到结果函数的最小值,我们将 f(x1,x3,y1,y3) 的偏导数设置为零。它们如下:

df/dx1 = 4x1-dy-dx+by-bx-2ax = 0   -->   x1 = ( dy+dx-by+bx+2ax)/4
df/dx3 = 4x3+dy-dx-by-bx-2cx = 0   -->   x3 = (-dy+dx+by+bx+2cx)/4
df/dy1 = 4y1-dy+dx-by-bx-2ay = 0   -->   y1 = ( dy-dx+by+bx+2ay)/4
df/dy3 = 4y3-dy-dx-2cy-by+bx = 0   -->   y3 = ( dy+dx+by-bx+2cy)/4

您可能会看到这是怎么回事,因为简单的术语重新排列会导致最终的解决方案。

Final solution