2011-01-27 14 views
3

考虑一个以坐标原点为中心的球体和一个内接二十面体,其方向为两个最远的顶点位于Z坐标轴上,另一个从任何顶点出现的边缘都位于XZ平面中。查找矢量在二十面体或其展开表面上的投影

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

是否有一种优雅的方式来找到穿孔的面(考虑到所有方面都列举出来),然后找到这个面上的穿孔点?需要执行此任务将穿透点投影到平坦的未折叠(未包裹)的二十面体表面。

+0

你能告诉我们一些关于你的坐标系吗?这可能会节省一些时间。 – 2011-01-27 20:37:07

+0

它是笛卡儿,3D。如果方便的话,我们可以在解决方案中自由转换为其他任何方式。 – mbaitoff 2011-01-27 20:44:33

回答

3

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

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

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

你需要这个矩阵的逆(SO搜索或谷歌在您所选择的语言快速3x3的倒数) 。 现在对于每个矢量,你想乘以所有20个matricies。因此,对于每个三角形计算:(?负)

B = V * T(逆)

如果B的所有3个元素为正,这是相交三角形。

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

我= B * T

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

最后一次优化。如果总结每个三角形的3个顶点,这将为您提供该三角形的法向量。如果您计算每个法线的矢量的点积,则具有最大点积的三角形将是相交的一个。这一事实是特定于正规多面体,其中原始射线源自原点。这比完成矩阵乘法以确定哪一个命中更快。你仍然需要做1矩阵乘法以找到重心坐标。

您也可以搜索光线三角形交叉点并阅读重心坐标,但这些解决方案将比这个特定问题要求更普遍。

1

好的,这不是我的领域,但没有其他人回答,所以我会刺伤它。您可以将二十面体表示为12个顶点 - 10个赤道顶点,再加上顶部和底部(对它们本质上没有任何赤道,这只是将它分类为我们的坐标系的一种方式)。

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

从你的矢量,你也可以确定方位角。如果您从顶点向量中获得了相应的派生方位角和高度,则这是一个相当简单的计算,即一组两个面(以及四个顶点)。计算给定矢量之间的角度间隔,每个顶点段将告诉你它面对的两个面中的哪一个面,而两个轴承总和中的较小者将是该面。

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

+0

是的,纬度'套'的想法也出现在我的脑海里。然而,只有当赤道“带”映射到球体上的圆而不是一组锯齿状弧时,它才会起作用。 – mbaitoff 2011-01-28 05:15:06