在正二十面体或其展开表面上找到一个向量的投影

5
考虑一个以坐标原点为中心的球体,内切一个二十面体,使得最远的两个顶点位于Z坐标轴上,并且从任何一个该顶点出发的边都在XZ平面上。
考虑给定一个向量x,起始于球体中心。由该向量给出的方向,在二十面体表面穿过某一点。
是否有一种优雅的方法来找到被穿过的面(考虑到所有面都已编号),然后找到该面上的穿孔点?这个任务需要将穿孔点投影到平铺的二十面体表面。

你能告诉我们一下你的坐标系吗?这可能会节省一些时间。 - Chris B. Behrens
它是笛卡尔坐标系的,是3D的。如果方便的话,我们可以自由地将其转换为解决方案中的任何其他内容。 - mbaitoff
2个回答

4

这个解决方案是针对你的应用程序而设计的,其中向量从原点发出,二十面体位于原点中心。

使用二十面体的12个顶点定义20个三角形。为了使每个三角形在从二十面体外部查看时呈逆时针顺序排序,请按顺序列出3个顶点。因此,对于每个三角形,您将得到一个由3个顶点组成的列表。对于每个三角形,构建一个3x3矩阵,其中列是该三角形的顶点:

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

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

B = V*T(inverse)

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

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

I = B*T

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

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

您还可以搜索光线三角形相交并阅读重心坐标,但这些解决方案将比此特定问题要求的更为一般化。


是的,这似乎是通过将任务分解为查找光线与三角形相交的小任务来找到解决方案的简单方法。我更喜欢第二种方式,我们不必乘以所有矩阵。我也在类似的方向上思考,只是我想计算给定方向与所有顶点的点积,而不是法线,然后找到三个最大值,这将选择感兴趣的三角形。虽然您提供了有效和强大的解决方案,但我也对某种优雅的解决方案(如果有的话)感兴趣。 - mbaitoff
点积之和就是总点积,所以这等价于我的普通测试。但是,你要寻找比矢量*矩阵加归一化更优雅的东西?你只需要计算三个矩阵的逆一次(甚至不必在运行时计算)。 - phkahler

1

好的,这不是我的专业领域,但是没有其他人回答,所以我会试着回答一下。你可以将一个二十面体表示为12个顶点 - 10个赤道顶点,加上顶部和底部(它们本质上与赤道无关,这只是一种为我们的坐标系分类的方式)。

这些顶点又可以表示为线段 - 一端是原点,另一端是顶点。在此基础上,您可以推导出相对于赤道的高度。如果您知道向量的高度(再次强调,相对于赤道),则可以确定向量与二十面体的哪三个部分相交 - 北部、南部或赤道集合。

从您的向量中,您还可以确定方位角。如果您有来自顶点向量的相应派生方位角和高度,则可以进行一组两个面(因此四个顶点)的简单计算。计算给定向量与每个顶点线段之间的角度差将告诉您它位于哪个面 - 较小的两个方位角之和的面就是那个面。

这就是我卡住的地方...我看不到确定与面相交点的简单方法。希望至少对第一部分有所帮助。


是的,纬度上的“集合”概念也在我的脑海中浮现。然而,它只有在赤道“带”映射到球体上的圆圈,而不是一组锯齿状弧线时才有效。 - mbaitoff
不幸的是,纬度方法行不通 - 请参见http://en.wikipedia.org/wiki/File:Uniform_tiling_532-t2.png - 赤道弧不形成恒定纬度线。 - mbaitoff
嗯...看起来我把一个二十面体近似为一对极锥,带有一个赤道环面...接近了,但还差一点。 - Chris B. Behrens
@Chris B. Behrens:我认为我正在缓慢地接近解决方案。它涉及到使用二十面体对称的六个自然轴和相应的点积的二分法(或多分法)。 - mbaitoff
1
请在所有的东西都准备好后再发布你的答案……我会很感兴趣看到它。 - Chris B. Behrens
@Chris B. Behrens:看起来phkahler在下面提供了解决方案。看起来非常好。 - mbaitoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接