Math 展平三维三角形

Math 展平三维三角形,math,language-agnostic,3d,Math,Language Agnostic,3d,我想写一个函数,它接受一个3d三角形(作为3点(vector3ds))并返回一个2d三角形(作为3点(vector2ds)): 当给定一个三维三角形时,它应该返回位于其平面上的点的二维坐标。(我所说的“其平面”是指所有三个点所在的平面) 我可以想尽办法做到这一点: 旋转三角形直到其法线等于+z(0,0,1),然后从每个点的(x,y)坐标构造一个三角形 我忍不住想,一定有更简单的方法来实现同样的目标 如果张贴代码示例,请尽量不要使用希腊字母。C/java风格语言中的一些伪代码是理想的。这个问题

我想写一个函数,它接受一个3d三角形(作为3点(vector3ds))并返回一个2d三角形(作为3点(vector2ds)):

当给定一个三维三角形时,它应该返回位于其平面上的点的二维坐标。(我所说的“其平面”是指所有三个点所在的平面)

我可以想尽办法做到这一点:

  • 旋转三角形直到其法线等于+z(0,0,1),然后从每个点的(x,y)坐标构造一个三角形
我忍不住想,一定有更简单的方法来实现同样的目标


如果张贴代码示例,请尽量不要使用希腊字母。C/java风格语言中的一些伪代码是理想的。

这个问题没有单一的答案

三角形所在的平面没有定义的原点,也没有定义的方向

最好将其中一个顶点定义为原点,并沿X轴定义一条边:

v1 = (0, 0)
您需要计算向量
A
(即
v2-v1
)和
B
(即
v3-v1

顶点2将位于:

v2 = (|A|, 0)
顶点3的位置可以通过使用来计算,例如:

所以,算出A x B,从中可以算出A和B之间夹角θ的正弦:

sin(theta) = | A x B | / (|A| * |B|)
顶点3位于以下坐标处:

v3 = |B| (cos(theta), sin(theta)) 
您可以利用
cos(θ)=sqrt(1-sin(θ)^2)
来避免任何反向触发操作


您还应该看到
|B|sin(θ)
只是
|A x B |/| A |
这个问题没有单一的答案

三角形所在的平面没有定义的原点,也没有定义的方向

最好将其中一个顶点定义为原点,并沿X轴定义一条边:

v1 = (0, 0)
您需要计算向量
A
(即
v2-v1
)和
B
(即
v3-v1

顶点2将位于:

v2 = (|A|, 0)
顶点3的位置可以通过使用来计算,例如:

所以,算出A x B,从中可以算出A和B之间夹角θ的正弦:

sin(theta) = | A x B | / (|A| * |B|)
顶点3位于以下坐标处:

v3 = |B| (cos(theta), sin(theta)) 
您可以利用
cos(θ)=sqrt(1-sin(θ)^2)
来避免任何反向触发操作


你还应该看到,
|B|sin(θ)
就是
|A x B |/| A |

从你的评论中,我推断你可以以任意方式选择平面的坐标系,只要该坐标系的欧几里德度量与三维坐标系的欧几里德度量所导出的度量相同。(也就是说,欧几里德距离将保持不变。)

一种可能的解决办法:

x0' = 0
y0' = 0

x1' = sqrt((x1 - x0)^2 + (y1 - y0)^2 + (z1 - z0)^2)
y1' = 0

x2' = ((x1 - x0) * (x2 - x0) + 
       (y1 - y0) * (y2 - y0) + 
       (z1 - z0) * (z2 - z0)) / x1'
y2' = sqrt((x2 - x0)^2 + (y2 - y0)^2 + (z2 - z0)^2 - x2'^2)

根据您的评论,我推断您可以以任意方式选择平面的坐标系,只要该坐标系的欧几里德度量与三维坐标系的欧几里德度量相同。(也就是说,欧几里德距离将保持不变。)

一种可能的解决办法:

x0' = 0
y0' = 0

x1' = sqrt((x1 - x0)^2 + (y1 - y0)^2 + (z1 - z0)^2)
y1' = 0

x2' = ((x1 - x0) * (x2 - x0) + 
       (y1 - y0) * (y2 - y0) + 
       (z1 - z0) * (z2 - z0)) / x1'
y2' = sqrt((x2 - x0)^2 + (y2 - y0)^2 + (z2 - z0)^2 - x2'^2)


三角形是如何表示的?i、 你递给我一个三维三角形,那是什么?这是一堆三个空间点吗?答案是模糊的。必须在三角形平面中指定任意坐标系。你可以选择这个坐标系,答案是(0,0),(1,0),(0,1)。这个平面的原点是什么?如果不是一个顶点,那么它必须是另一个任意点。希腊字母有什么问题?@root45可能是对他们财政状况的抗议?三角形如何表示?i、 你递给我一个三维三角形,那是什么?这是一堆三个空间点吗?答案是模糊的。必须在三角形平面中指定任意坐标系。你可以选择这个坐标系,答案是(0,0),(1,0),(0,1)。这个平面的原点是什么?如果不是一个顶点,那么它必须是另一个任意点。希腊字母怎么了?@root45也许这是对他们财政状况的抗议?你似乎在使用点积来计算
cos(θ)
-这难道不存在导致三角形正常“翻转”的风险吗(尽管新坐标系有些随意)?@Alnitak为什么要这样做?三角形的角度总是<180度。@ChristianRau,因为它也可能是-180<θ<0(即如果v3位于从v1到v2的向量的“右侧”)@Alnitak:从OP的评论中我能推断出的唯一条件是坐标系的选择应该保持欧几里德距离。没有要求方向守恒。@SvenMarnach确实我不认为这太重要,因为方向是任意的。我只是在我ad故意使用叉积正弦规则而不是点积余弦规则来减轻影响。您似乎是在使用点积来计算
cos(θ)
-这难道不存在导致三角形法线“翻转”的风险吗(尽管新坐标系有些随意)?@Alnitak为什么要这样做?三角形的角度总是<180度。@ChristianRau,因为它也可能是-180<θ<0(即如果v3位于从v1到v2的向量的“右侧”)@Alnitak:从OP的评论中,我能推断出的唯一条件是坐标系的选择应该保持欧几里德距离。方向守恒是不需要的