我有一个应用程序通过细分二十面体来创建球体的近似值。笛卡尔顶点坐标转换为球面坐标,以便所有顶点都位于单位球体的表面上。
接下来我需要做的是找到球体表面上任意点的最近顶点。我提出了两个简单的算法......
强力搜索 - 对于少量顶点可以是正常的,但对于更精细的细分则会过度。
排序/索引搜索 - 通过方位角和倾斜度将顶点排序为某种形式的顺序,然后通过限制其范围来创建粗略索引以加速暴力搜索。
我想知道是否有一个更微妙,更有希望更高性能的算法,我可以使用而不是上面两个中的一个。
更新1:我刚刚回忆起,对于应用程序的另一部分,顶点存储有关其邻居的信息。我的新算法是
答案 0 :(得分:1)
可能的解决方案之一是为顶点构建BSP树:http://en.wikipedia.org/wiki/Binary_space_partitioning
答案 1 :(得分:1)
扫描回复,我想我可能会偏离基础,但你所追求的很简单。我想。
由于你只处理位于球体上的点,你可以从顶点到球体的中心放一条线,从任意点到中心放下另一条线并求解之间产生的角度他们。越小越好。我认为最简单和最便宜的方式是点积。角度基本上不属于它。这是关于它的链接:http://www.kynd.info/library/mathandphysics/dotProduct_01/ 为了测试它们,我建议选择一个顶点,测试它,然后测试它的邻居。它应该总是在最小邻居的方向上(角度应该随着你越接近你所追求的顶点而减小)
无论如何,我希望这就是你所追求的。 哦,我在寻找您的细分算法时遇到了这个页面。很难找到;如果你可以发布一个链接,我认为它会比我自己更多的帮助。
答案 2 :(得分:0)
如果二十面体在北极有一个顶点而在南极有一个相对的顶点,那么有5个顶点的2个组,这些顶点位于与赤道平行的平面上。使用一个小几何,我认为这些平面是N / S 57.3056°(小数,而不是dd.mmss)。这将你的二十面体划分为4个纬度区域;
我正在以导航仪的方式工作,弧度以度数衡量并表示南北;如果你更喜欢更符合数学的惯例,你可以很容易地将它全部翻译成你的球面坐标版本。
我怀疑,虽然我没有编码,但是检查到5个顶点的距离并选择最近的顶点将比基于将球体表面划分为二十面体面的投影的更复杂的方法更快,或者将球体上的点投射到二十面体上并在该坐标系中处理问题。
例如,您在更新1中建议的方法至少需要计算到6个顶点(第一个,任意选择的一个及其5个邻居)的距离。
无论您是否只想知道哪个顶点最近,都无关紧要计算笛卡尔坐标或球坐标的距离。但是,在笛卡尔坐标系中的计算避免了对三角函数的大量调用。
另一方面,如果你没有在你的球体的极点上安排你的二十面体顶点,那么你应该有!