展平3d三角形

时间:2011-11-08 13:35:55

标签: math language-agnostic 3d

我想写一个带3d三角形的函数(3点(vector3ds))并返回2d三角形(3点(vector2ds)):

当给出一个3d三角形时,它应该返回它们位于平面上的点的2维坐标。 (“它的平面”是指所有三个点所在的平面。)

我可以认为这是一个漫长的方式:

  • 旋转三角形直到其法线等于+ z(0,0,1),然后从每个点的(x,y)坐标构造一个三角形。

我无法帮助,但认为必须有一种更简单的方法来实现同样的目标。

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

2 个答案:

答案 0 :(得分:4)

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

一种可能的解决方案:

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)

答案 1 :(得分:3)

这个问题没有单一的答案。

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

您可以做的最好的事情是将其中一个顶点定义为原点,并将其中一个边沿X轴放置:

v1 = (0, 0)

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

Vertex 2将位于:

v2 = (|A|, 0)

可以使用vector cross product rule来计算顶点3的位置,例如:

A x B = |A| * |B| sin(theta)

所以,找出A x B,然后你可以在 A {之间找出角度 theta 的正弦值{1}}

B

然后,顶点3位于坐标处:

sin(theta) = | A x B | / (|A| * |B|)

您可以利用v3 = |B| (cos(theta), sin(theta)) 来避免任何反向触发操作。

您还应该看到cos(theta) = sqrt(1 - sin(theta) ^ 2)只是|B| sin(theta)