如何在静态坐标系和动态坐标系之间进行转换

时间:2016-04-17 06:21:23

标签: math geometry linear-algebra coordinate-systems coordinate-transformation

我有这样的设置:

enter image description here

2个坐标系。 (x,y)是主坐标系,(x',y')是位于(x,y)内的坐标系。系统(x',y')由点x1或x2定义,如果我移动这两个点(x',y')则相应地移动。 (x',y')的原点被定义为从x1到x2的向量的中间,y' axis是穿过原点的x1-> x2上的法向量。如果我在(x',y')中定义了一个点x3并且我移动x1或x2中的任何一个以使原点移位,那么我如何相应地移动x3以使其保持其在新的位置(x',y')? 我如何进行转换,总是将(x,y)中的一个点转换为(x',y')中的一个点,以确定x1和x2是如何设置的?

我在想,如果我有更多的分数而不仅仅是我正在移动的那个(x1或x2),我想我可以尝试估算转换的θ,tx,ty

[x2']   [cos(theta) , sin(theta), tx][x2]
[y2'] = [-sin(theta), cos(theta), ty][y2]
[ 1 ]   [    0      ,      0    , 1 ][1 ]

只是将估计的转换应用到x3,我会很好......嗯,但我认为我需要3分才能估计theta,tx和ty对吗? 我的意思是我可以估计使用一些最小二乘法......但是3个未知数需要3个坐标集吗?

我试图实现这个并计算一个例子。我希望你理解语法。它并没有真正给我我的期望:

import math
import numpy as np

x1=[ 0,10]
x2=[10,20]

rx = x2[0] - x1[0]
ry = x2[1] - x1[1]
rlen = math.sqrt(rx*rx+ry*ry)
c = rx / rlen
s = ry / rlen


dx = - ( x1[0] + x2[0] )/2 # changing the sign to be negative seems to 
dy = - ( x1[1] + x2[1] )/2 # rectify translation. Rotation still is wrong

M = np.array([[c, -s, 0],[s, c, 0],[dx, dy, 1]])
print( np.dot(x2 + [1],M) )
# Yields -> [ 15.92031022  -8.63603897   1.        ] and should yield [5,0,1]

由于我试图变换x2坐标,因此结果在y分量中不应该为0,因为它位于x轴上?

好的,我尝试从dynamic1到dynamic2执行x3的实现,其中检查x3应该在d1和d2中以相同的坐标结束。我按照你的建议做到了,但我在d1和d2都没有得到相同的坐标。我误解了什么吗?

import math
import numpy as np

x1=[ 1,1]
x2=[ 7,9]

x3=[4,3]

rx = (x2[0] - x1[0])
ry = (x2[1] - x1[1])
rlen = math.sqrt( rx*rx + ry*ry )
c = rx / rlen
s = ry / rlen


dx =  ( x1[0] + x2[0] )/2
dy =  ( x1[1] + x2[1] )/2

M = np.array([[c, -s, 0],[s, c, 0],[-dx*c-dy*s, dx*s-dy*c, 1]])
Minv = np.array([[c, s, 0],[-s, c, 0],[dx, dy, 1]])


x1new=[ 1,1]
x2new=[ 17,4]

rxnew = (x2new[0] - x1new[0])
rynew = (x2new[1] - x1new[1])
rlennew = math.sqrt( rxnew*rxnew + rynew*rynew )
cnew = rxnew / rlennew
snew = rynew / rlennew


dxnew =  ( x1new[0] + x2new[0] )/2
dynew =  ( x1new[1] + x2new[1] )/2

Mnew = np.array([[cnew, -snew, 0],[snew, cnew, 0],[-dxnew*cnew-dynew*snew, dxnew*snew-dynew*cnew, 1]])
Mnewinv = np.array([[cnew, snew, 0],[-snew, cnew, 0],[dxnew, dynew, 1]])

M_dyn1_to_dyn2 = np.dot(Minv,Mnew)

print( np.dot(x3 + [1], M) )
print( np.dot(x3 + [1], M_dyn1_to_dyn2))
#yields these 2 outputs which should be the same:
[-1.6 -1.2  1. ]
[-3.53219692  8.29298408  1.        ]

2 个答案:

答案 0 :(得分:1)

编辑。矩阵校正。

要将坐标从静态系统转换为$定义的坐标,您必须应用仿射变换。 此转换的矩阵(x1,x2)由移位矩阵M和关于原点S的旋转组成。

矩阵RMS的组合:

R

此处 c -s 0 M = s c 0 -dx*c-dy*s dx*s-dy*c 1 c是旋转角度的余弦和正弦值,它们的值分别是单位(标准化)向量s的{​​{1}}和x-分量

y-

转换组件:

x1x2

要将(xx,yy)坐标从静态系统转换为旋转一个,我们必须找到

rx = x2.x - x1.x
ry = x2.y - x1.y
len = Sqrt(rx*rx+ry*ry)
c = rx / Len
s = ry / Len

快速检查:

dx = (x1.x + x2.x)/2
dy = (x1.y + x2.y)/2

P.S。请注意,将dyn.coordinates转换为静态的矩阵与xx' = xx*c+yy*s-dx*c-dy*s = c*(xx-dx) + s*(yy-dy) yy' = -xx*s+yy*c+dx*s-dy*c = -s*(xx-dx) + c*(yy-dy) 相反,并且更简单:

X1 = (1,1)
X2 = (7,9) 
dx = 4
dy = 5
rx = 6
ry = 8
Len = 10
c = 0.6
s = 0.8

for point (4,5):
xx-dx = 0
yy-dy = 0
xx',yy' = (0, 0) - right

for point X2 =(7,9):
xx-dx = 3
yy-dy = 4
xx' = 0.6*3 + 0.8*4 = 5   -right
yy' = -0.8*3 + 0.6*4 = 0  -right

P.P.S。您需要三对对应点来定义一般仿射变换。在这里你似乎不需要缩放和透明,所以你可以用x1,x2点确定所需的变换

答案 1 :(得分:0)

我认为你需要双维数组来保存和设置你的值

结构就像这样

    //declare the double dimension array
    double matrix[][] = new double[3][2];

    //setting location first point, x
    matrix[0][0] = 1;
    //setting location first point, y
    matrix[0][1] = 1;

    //fill with your formula, i only give example
    //fill second point with first point and plus 1
    //setting location second point, x
    matrix[1][0] = matrix[0][0] + 1;
    //setting location second point, y
    matrix[1][1] = matrix[0][1] + 1;

    //fill with your formula, i only give example
    //fill third point with second point and plus 1
    //setting location third point, x
    matrix[2][0] = matrix[1][0] + 1;
    //setting location third point, y
    matrix[2][1] = matrix[1][1] + 1;

我将在答案中使用java

$scope