使用Excel更改三维坐标系

在我的电子表格中,在一定的坐标系统中有一个云点,云的格式如下: Name XYZ PT1 X1 Y1 Z1 PT2 X2 Y2 Z2 PT3 X3 Y3 Z3 PT4 X4 Y4 Z4 ... PTi Xi Yi Zi ... I想在我的列表中使用四个第一点来构build一个新的坐标系,并把我所有的点转移到新的坐标系中。

新的坐标系必须被定义为一个平面线点(或者3-2-1°的变换:

  1. 平面是(PT1,PT2,PT3,PT4)的最佳拟合平面。 我知道如何使用Excel LINEST公式构build平面方程
  2. 线/vector中点(PT1-PT2)到中点(PT3-PT4)线/vector在Excel中易于构build
  3. 点是中点(PT1-PT2)。

总结起点(0,0,0)将在中点(PT1-PT2)。 新的X轴将是vector中点(PT1-PT2)到中点(PT3-PT4)。 Y轴将被包含在平面中并垂直于X.Z将垂直于X和Y.

目前我可以find平面,X,Y,Z轴的方程。

我的问题是如何构build基于这些参数的变换matrix,并使用Excel公式实现它。

谢谢。

我试图把答案分成五个部分。 我将调用x,y,z旧轴以O和X,Y,Z为中心,新轴以P为中心。

尝试将第一次尝试的结果保存在空单元格中。 我不能给你一个独特的公式,一步回答你的问题。

a)通用转换是旋转转换。 你在P点find你的新起源(你有坐标)。 假设你的“原点”是O =(0,0,0),我可以简单地说,从原点到新原点的平移是d = | PO | = | P | 在这两个系统中向量P的欧几里得范数,在Excel中很容易计算(我不知道是否有函数,我会用毕达哥拉斯定理)。 有人试图在这里build立一个用户定义的macros

b)现在您已经有了平移向量(t1,t2,t3),您可以为旧轴设置一个新的原点,而不必旋转它们。 注意符号,但是是一个简单的翻译公式(见例子:if x = x'+ t1 then x'= x – t1)认为哪个是x',哪个是x在你的情况下,用一个简单的点(1,0,0),看看你的select是否好。 做所有你的点的翻译(即:PT1_t,PT2_t …)现在你有一个中间参考系统xyz和XYZ之间。 我们称之为“pqr”

c)现在您的参考系统pqr和XYZ仅在旋转angular度上有所不同。 在构build旋转matrix之前,必须先确定哪个轴将先旋转。 最好使用归一化vector(将每个vector除以它的范数)假设来自pqr系统和XYZ的旋转是围绕固定轴(最多)旋转3圈的组合。 例如

  1. 你将围绕Z轴旋转pqr,将X版本的versor p放入。 你将获得一个“新”pqr“系统。 这是用一个3×3旋转matrixRX(我们还不知道)
  2. 您将使用RY旋转y周围的pqr'使versor p'与versor Xalignment。 你现在有pqr''
  3. 您将使用围绕X和matrixRX的旋转将q轴与Y轴和r轴alignment。 pqr'''与XYZ完全alignment

总旋转是R = RX * RY * RZ,matrix积。 如何find旋转? (按照我的旋转顺序是不是强制性的!你可以build立你自己的序列,但XYZ,ZYX和ZXZ是最有名的)。

d)每个matrix都需要一个angular度。 第一个angular度是p和它在XZ平面上的投影之间的angular度。 第二个angular度是p'(= RZ * p)和X之间的angular度,第三个angular度是q'(= RY * q'= RY * RX * q)和Y之间的angular度。它必须相等(有误差)到r“和Z之间的angular度。matrix可以像这样构build(如果A是一个通用angular度)

 RX = [1 0 0 0 cos(A) -sin(A) 0 sin(A) cos(A)] 

在这个链接上检查RY和RZ ,但要注意:正如我们之前所说的,A是一个方向的旋转angular度,所以你可能需要-A来进行旋转。 一般来说(但是validation一下)A是从旧轴到新轴的angular度,正A是逆时针。

要计算angular度A,请使用此处显示的简单公式。 Excel有你需要的所有测angular公式(余弦,反余弦…)。

e)一旦你find了三个matrixRX RY RZ,它们是在旧的pqr轴旋转的情况下演奏的,新的XYZ系统中的每一个点PTi'都是从PTi'= R * PTi_t中获得的。 您可以简单地使用在此解释的MMULT excel函数来构buildmatrix产品

对不起,我是一个简单的学生。 我希望它可以帮助你。

看看这个代码,允许按行排列的点的旋转。

SCR

首先是三个函数,这些函数需要一系列值并对X,Y或Z应用相应的旋转。

 Public Function RotPointsX(ByRef pts() As Variant, angle_rad As Double) As Variant() Dim n As Integer n = UBound(pts, 1) If UBound(pts, 2) <> 3 Then 'Need Three Points Exit Function End If Dim tX As Double, tY As Double, tZ As Double Dim X As Double, Y As Double, Z As Double For i = 1 To n tX = pts(i, 1): tY = pts(i, 2): tZ = pts(i, 3) X = tX Y = tY * Cos(angle_rad) - tZ * Sin(angle_rad) Z = tY * Sin(angle_rad) + tZ * Cos(angle_rad) pts(i, 1) = X: pts(i, 2) = Y: pts(i, 3) = Z Next i RotPointsX = pts End Function Public Function RotPointsY(ByRef pts() As Variant, angle_rad As Double) As Variant() Dim n As Integer n = UBound(pts, 1) If UBound(pts, 2) <> 3 Then 'Need Three Points Exit Function End If Dim tX As Double, tY As Double, tZ As Double Dim X As Double, Y As Double, Z As Double For i = 1 To n tX = pts(i, 1): tY = pts(i, 2): tZ = pts(i, 3) X = tZ * Sin(angle_rad) + tX * Cos(angle_rad) Y = tY Z = tZ * Cos(angle_rad) - tX * Sin(angle_rad) pts(i, 1) = X: pts(i, 2) = Y: pts(i, 3) = Z Next i RotPointsY = pts End Function Public Function RotPointsZ(ByRef pts() As Variant, angle_rad As Double) As Variant() Dim n As Integer n = UBound(pts, 1) If UBound(pts, 2) <> 3 Then 'Need Three Points Exit Function End If Dim tX As Double, tY As Double, tZ As Double Dim X As Double, Y As Double, Z As Double For i = 1 To n tX = pts(i, 1): tY = pts(i, 2): tZ = pts(i, 3) X = tX * Cos(angle_rad) - tY * Sin(angle_rad) Y = tX * Sin(angle_rad) + tY * Cos(angle_rad) Z = tZ pts(i, 1) = X: pts(i, 2) = Y: pts(i, 3) = Z Next i RotPointsZ = pts End Function 

接下来,我需要一个函数来将一个范围转换成一个数组,以及用这个函数完成这个操作的最简单的方法:

 Public Function AsArray(ByVal r_pts As Range) As Variant() AsArray = r_pts.Value2 End Function 

最后在我的工作表中,我将旋转作为嵌套函数,并使用CtrlShiftEnter作为数组function进入

SCR

因此,对于ZYX的欧拉旋转,需要input以下内容

 =RotPointsX( RotPointsY( RotPointsZ( AsArray(<range>), angle_z), angle_y), angle_x) 

反转是负angular度的XYZ旋转

 =RotPointsZ( RotPointsY( RotPointsX( AsArray(<range>), -angle_x), -angle_y), -angle_z) 

我通过恢复原始点来validation这一点

SCR

Interesting Posts