在二十面体或其展开的表面上找到矢量的投影

时间:2011-01-27 20:15:12

标签: 3d geometry computational-geometry

考虑一个中心位于坐标原点的球体和一个刻有二十面体的球体,其定向使得两个最远的顶点位于Z坐标轴上,并且从任何顶点出现的一个边缘位于XZ平面中。

考虑一个来自球体中心的给定向量x。由此向量给出的方向在某一点刺穿二十面体的表面。

是否有一种优雅的方法可以找到穿孔的小平面(考虑所有小平面都被列举),然后在这个小平面上找到穿孔点?需要执行此任务以将穿透点投射到平展的(未展开的)二十面体表面。

2 个答案:

答案 0 :(得分:3)

此解决方案特定于您的应用程序,其中向量从原点发出,而二十面体以原点为中心。

使用二十面体的12个顶点定义20个三角形。从二十面体外部观察时,对3进行排序以使它们处于逆时针顺序。因此,对于每个三角形,您将拥有3个顶点的列表。对于每个三角形构造一个3x3矩阵,其中列是三角形的顶点:

    [ x1 x2 x3 ]
T = [ y1 y2 y3 ]
    [ z1 z2 z3 ]

您需要使用此矩阵的反转(搜索SO或谷歌以您选择的语言快速3x3反转)。 现在,对于每个向量,您希望将它乘以所有20个matricies。所以对于每个三角形计算:

B = V * T(反向)

如果B的所有3个元素都是正数(负数?),则这是相交的三角形。

接下来,将B标准化 - 除以它的长度,使其具有单位长度。这将使B成为该三角形上交点的重心坐标。您还可以通过将重心坐标乘以原始点矩阵来计算实际交点I:

I = B * T

这也适用于在展开的三角形上找到交点的2D坐标。因此,使用2D坐标的2x3矩阵代替T。

最后一次优化。如果对每个三角形的3个顶点求和,这将为您提供该三角形的法线向量。如果使用每个法线计算向量的点积,则具有最大点积的三角形将是相交的三角形。这个事实特定于以原点为中心的正多面体,其中有关的光线来自原点。这比整个矩阵乘法更快以确定哪一个被击中。您仍然需要进行1次矩阵乘法才能找到重心坐标。

您还可以搜索光线三角形交叉点并阅读有关重心坐标的信息,但这些解决方案将比这个特定问题所需的更加通用。

答案 1 :(得分:1)

好吧,这不是真正的我的领域,但没有其他人回答,所以我会捅它。你可以将二十面体表示为12个顶点 - 10个赤道顶点,加上顶部和底部(没有固有的赤道,这只是一种为我们的坐标系分类的方法)。

反过来,那些顶点可以表示为段 - 一端是原点,另一端是顶点。鉴于此,您可以推导出赤道以上的高度。如果您知道向量的高度(同样,在赤道上方),您可以确定向量相交的二十面体的三个部分中的哪一个 - 北部,南部或赤道集。

从矢量中,您还可以确定方位角。如果从顶点矢量得到各自的导出方位角和高度,那么计算一组两个面(因而是四个顶点)就相当简单。计算给定矢量之间的角度间隔,每个顶点区段将告诉您它所在的两个面中的哪一个面 - 两个轴承总和中较小的一个将是该面。

那就是我被困住的地方......我看不出一种简单的方法来确定与脸部的交点。希望这对第一部分至少有帮助。