求向量在二十面体或其展开表面上的投影

mba*_*off 6 3d geometry computational-geometry

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

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

有没有一种优雅的方法来找到穿孔的面(考虑到所有的面都被枚举),然后找到这个面上的穿孔点?此任务需要将刺穿点投影到平坦的展开(展开)二十面体表面。

phk*_*ler 4

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

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

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

您需要该矩阵的逆矩阵(用您选择的语言搜索 SO 或 google 查找快速 3x3 逆矩阵)。现在,对于每个向量,您想要将其乘以所有 20 个矩阵。因此对于每个三角形计算:

B = V*T(倒数)

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

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

我=B*T

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

最后一项优化。如果将每个三角形的 3 个顶点相加,就会得到该三角形的法向量。如果计算向量与每条法线的点积,则具有最大点积的三角形将是相交的三角形。这一事实特定于以原点为中心且所讨论的射线从原点发出的正多面体。这比通过整个矩阵相乘来确定哪个矩阵被击中要快。您仍然需要进行 1 次矩阵乘法才能找到重心坐标。

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