H3 v4.1.0:二十面体面i/j/k轴与顶点0的定义规则咨询
H3 v4.1.0二十面体面顶点0与ijk轴的确定规则
问题背景
我正在研读H3(v4.1.0)的源代码,在faceijk.c文件的86~130行发现如下代码:
/** @brief icosahedron face ijk axes as azimuth in radians from face center to * vertex 0/1/2 respectively */ static const double faceAxesAzRadsCII[NUM_ICOSA_FACES][3] = { {5.619958268523939882, 3.525563166130744542, 1.431168063737548730}, // face 0 {5.760339081714187279, 3.665943979320991689, 1.571548876927796127}, // face 1 {0.780213654393430055, 4.969003859179821079, 2.874608756786625655}, // face 2 {0.430469363979999913, 4.619259568766391033, 2.524864466373195467}, // face 3 {6.130269123335111400, 4.035874020941915804, 1.941478918548720291}, // face 4 {2.692877706530642877, 0.598482604137447119, 4.787272808923838195}, // face 5 {2.982963003477243874, 0.888567901084048369, 5.077358105870439581}, // face 6 {3.532912002790141181, 1.438516900396945656, 5.627307105183336758}, // face 7 {3.494305004259568154, 1.399909901866372864, 5.588700106652763840}, // face 8 {3.003214169499538391, 0.908819067106342928, 5.097609271892733906}, // face 9 {5.930472956509811562, 3.836077854116615875, 1.741682751723420374}, // face 10 {0.138378484090254847, 4.327168688876645809, 2.232773586483450311}, // face 11 {0.448714947059150361, 4.637505151845541521, 2.543110049452346120}, // face 12 {0.158629650112549365, 4.347419854898940135, 2.253024752505744869}, // face 13 {5.891865957979238535, 3.797470855586042958, 1.703075753192847583}, // face 14 {2.711123289609793325, 0.616728187216597771, 4.805518392002988683}, // face 15 {3.294508837434268316, 1.200113735041072948, 5.388903939827463911}, // face 16 {3.804819692245439833, 1.710424589852244509, 5.899214794638635174}, // face 17 {3.664438879055192436, 1.570043776661997111, 5.758833981448388027}, // face 18 {2.361378999196363184, 0.266983896803167583, 4.455774101589558636}, // face 19 };
根据注释,变量faceAxesAzRadsCII用于硬编码每个二十面体面的i、j、k轴的方位角(以弧度为单位)。我的问题是:给定一个二十面体面,如何确定其三个顶点中的哪一个是“顶点0”,进而确定i、j、k轴?选择顶点0遵循什么规则?
解答
H3中二十面体面的顶点编号(包括顶点0)和ijk轴的映射是预定义的固定规则,核心逻辑如下:
顶点0的选择规则:
- H3的二十面体采用全局固定的顶点和面编号体系,每个面的三个顶点对应三个预定义的全局顶点ID,顶点0就是该面绑定的第一个全局顶点,这个映射关系在H3几何初始化阶段就已硬编码,不会动态变化。
- 从面的外侧(朝向球面外部)观察时,顶点0、1、2的排列遵循右手螺旋逆时针顺序,这保证了所有面的局部坐标系方向一致,避免网格细分时出现方向混乱。
ijk轴的确定:
每个轴对应从面中心指向对应顶点的方向:- i轴指向顶点0
- j轴指向顶点1
- k轴指向顶点2
你看到的faceAxesAzRadsCII数组中的数值,是预计算好的每个面中心到三个顶点的球面方位角(绕极轴的角度,单位弧度),这些值基于H3固定的二十面体几何结构直接生成,不需要在运行时动态计算。
内容的提问来源于stack exchange,提问作者Quenton
相关产品推荐
相关产品推荐

