我有一个全局坐标系(X,Y,Z)和一个带点(A,B,C和中心)的三角形。我知道那些点的所有坐标。
>> A=[10.63307; -7.72528; 21.26636];
B=[4.06139; -12.49988; 21.26636];
C=[-6.57172; -20.22529; 13.14344];
Centr=[-4.38113; -13.48349; 18.55872];
>> V1=(B-A)/(norm(B-A))
V1 =
-0.8090
-0.5878
0
>> V2=((C-A)-(dot((C-A),V1)*V1))/(norm((C-A)-(dot((C-A),V1)*V1)))
V2 =
0.0000
-0.0000
-1.0000
>> V3=cross(V1,V2)
V3 =
0.5878
-0.8090
0.0000
>> M=[V1,V2,V3]
M =
-0.8090 0.0000 0.5878
-0.5878 -0.0000 -0.8090
0 -1.0000 0.0000
>> Anew=inv(M)*(A-Centr)
Anew =
-15.5313
-2.7076
4.1666
>> Bnew=inv(M)*(B-Centr)
Bnew =
-7.4083
-2.7076
4.1666
>> Cnew=inv(M)*(C-Centr)
Cnew =
5.7350
5.4153
4.1666
这就是我得到的: From this
答案 0 :(得分:2)
问题可以表示为找到3乘3矩阵M
,以便可以在旧坐标系(P
,3之间转换点P_old
的坐标行)和新的坐标系(P_new
,3行)。这是一个仿射变换:
P_old = Center + M * P_new (1)
使用M
的(矩阵向量)乘法将其定向回旧系统,并添加Center
的坐标将其转换回旧原点。
然后可以将等式(1)变为:
P_new = M^{-1} * (P_old - Center) (2)
其中M^{-1}
是M
的倒数,用于计算旧坐标的新坐标(如果该点属于三角形平面,则第三行将为0)。
矩阵M
由旧系统中新基础的坐标构成,每列中有一个基础向量。现在必须找到这样的基础。
这个基础可以从(这是所有伪代码)中获取:
重整归一化AB
AB
V1 = ______
|| AB ||
AB
此处为向量AB
(顶部带箭头):
|b_x - a_x|
|b_y - a_y|
|b_z - a_z|
|| . ||
是欧几里德规范(^2
表示正方形,而不是 xor ):
|| V || = sqrt(V_x^2 + V_y^2 + V_z^2)
AC
(也是一个矢量,定义为AB
),但减去V1
上的投影,使其与V1
正交,并重新规范化(此如果三角形实际上不是三角形,则会以零除零失败):
AC - (AC.V_1) V1
V2 = _______________________
|| AC - (AC.V_1) V1 ||
M.N
是标量产品:
M.N = M_x * N_x + M_y * N_y + M_z * N_z
(AC.V_1) V1
只是标量(AC.V_1)
的产物,带有向量,V1
第三个矢量,可以作为交叉乘积来得到笛卡尔坐标系:
V3 = V1 x V2
交叉产品定义为:
|V1_y*V2_z - V1_z*V2_y|
V1 x V2 = |V1_z*V2_x - V1_x*V2_z|
|V1_x*V2_y - V1_y*V2_x|
然后M可以被视为|V1 V2 V3|
(每个Vx
在3行上),然后它的逆计算使用公式(2)。
这种变换(倒M)应该为三角平面上的点生成新坐标,第三轴上有0(这使得它在该平面上具有2D坐标),并保留大小欧几里得规范。