You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:08:18