我有一个由四个点组成的形状,A,B,C和D,其中唯一的位置是已知的。目标是将这些点转换为相对于彼此具有特定角度和偏移。
例如:A(-1,-1) B(2,-1) C(1,1) D(-2,1)
,应转换为完美的正方形(所有角度90),AB,BC,CD和AD之间的偏移均为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迭代求解。
这是我得到的数据(红色)给出的数据(黑色):
这需要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)
表示四边形的给定角按顺时针顺序。由于我们正在拟合一个正方形,因此我们对四个角的位置有一定的限制。实际上,如果给出两个对角,它们就足以描述一个独特的正方形(除了对角线上的镜像)。
这意味着两个对角足以代表我们的目标正方形。我们可以使用前两个角的分量来参数化剩下的两个角。在上面的例子中,我们用 P2
和 P4
表示 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
您可能会看到这是怎么回事,因为简单的术语重新排列会导致最终的解决方案。