我有这样的设置:
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. ]
答案 0 :(得分:1)
编辑。矩阵校正。
要将坐标从静态系统转换为$
定义的坐标,您必须应用仿射变换。
此转换的矩阵(x1,x2)
由移位矩阵M
和关于原点S
的旋转组成。
矩阵R
是M
和S
的组合:
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