关于算法:将向量从球体上的网格捕捉到一个点(二十面体)

Snapping vector to a point from a grid on a sphere (icosahedron)

这是一个使您的大脑彻底颠倒的问题,我已经尝试解决了很长时间。

假设您的球体位于3d空间的原点。球体被分割成等距点的网格。形成网格的过程并不那么重要,但对我来说似乎很简单的是使用常规的3d计算机图形球体生成过程(下图中描述的形成球体的算法)

现在,在有了这样的球体(即一定程度的二十面体)之后,我需要一个计算上很简单的过程,该过程将能够将随机单位矢量捕捉(成一个angular)到其最接近的二十面体边缘点。如果将矢量捕捉到该矢量相交的三角形的中心点,也是可以接受的。

我想强调一点,重要的是,该过程在计算上应该是微不足道的。这意味着实际上在内存中创建一个球体然后在球体中的每个三角形之间进行搜索的过程不是一个好主意,因为这种搜索将需要访问全局堆和ram,这很慢,因为我需要执行此过程数百万次在低端移动硬件上。

该过程应通过仅基于两个值的二十面体(即球面)和度数的一组数学方程式得出结果

有什么想法吗?预先谢谢您!

============

编辑

在我脑海中浮现出一种想法,似乎在第3步下面的图中(即,将每个新顶点投影到单位球体上)根本不重要,因为在二等分之后,每个顶点到球体的投影都将保留我们试图捕捉的两等分形状的所有angular特征。因此,该任务简化为识别被矢量穿透的二等分子三角形坐标。

This is icosahedron


制作一个包含20个顶级二十面体面坐标条目的表-例如,从Wiki坐标集构建它们)

The vertices of an icosahedron centered at the origin with an
edge-length of 2 and a circumscribed sphere radius of 2 sin (2π/5) are
described by circular permutations of:

1
2
3
 V[] = (0, ±1, ±?)
 where ? = (1 + √5)/2
 is the golden ratio (also written τ).

并计算相应的中心向量C [](每个面的顶点三个向量的总和)。

使用向量P和所有C []的最大点积(DP)查找最接近的中心向量。也许可以减少考虑到P分量的支票数量(例如,如果P和某些V [i]的点积为负,则不认为面部是V [i]的邻居)。不确定与直接对DP与中心进行完全比较相比,消除这种花费的时间要少。

确定了大三角形的面后,将P投影到该面的平面上,并在uv中获得P \\'的坐标(用AB和AC分解AP \\',其中A,B,C是面顶点)。 >

将u,v乘以2 ^ N(细分度)。

1
2
3
4
5
6
 u' = u * 2^N
 v' = v * 2^N
 iu = Floor(u')
 iv = Floor(v')
 fu = Frac(u')
 fv = Frac(v')

u \\'的整数部分是小三角形的" row ",v \\'的整数部分是" column "。小数部分是小三角形面内的三线性坐标,因此我们可以选择fu, fv, 1-fu-fv的最小值以获得最接近的顶点。计算此最接近的顶点,并在需要时归一化向量。


它不是等距的,您可以查看是否学习了该版本:
enter image description here

这是测地线圆顶频率的问题,有些人花了很多时间研究所有已知的制作几何形状的方法:http://geo-dome.co.uk/article.asp?uname=domefreq,看到那个家伙是一个自标记的geodesizer:)

一页告诉我进展是这样的:2 10·4N(12,42,162 ...)

您可以将其简化为一个简单的平面分形三角形,其中每个三角形分成4个较小的三角形,并且每次细分围绕一个球体旋转12次。

从逻辑上讲,只有一个三角形旋转了12次,如果在那一侧求解代码,则测地线的计算版本最低。

如果您不想将12个面作为一系列数组保留,并且想要一个较低的内存版本,则可以阅读有关中点细分代码的信息,其中有很多版本的中点细分。铅>

我可能完全错过了一些东西。只是没有真正的等距测地线圆顶,因为三角形不映射到球体,仅适用于icos。