经过大量研究,我找到了解决这个问题的方法:
首先,我已将方案更改为 NESTED。使用 NESTED 方案和非常高的 nSide 值(8192),从
void ang2pix_ring( const long nside, double theta, double phi, long *ipix)
函数返回一个长值,可以通过以下方式读取 UV 坐标:
位 26 到 30 表示级别 0(仅 12 个 HEALPix 像素)。
通过使用更高的级别,从 30 到 26 的位(级别 * 2)代表 HEALPix 像素。
剩余的 26 - (level * 2) - 1 直到 bit 1 以下列方式对 UV 纹理坐标进行编码:
每第二个奇数位收缩在一起表示 U 坐标,偶数一次表示 V 坐标。
为了标准化这些 UV 坐标,响应的收缩值需要除以 pow(2, (26 - level * 2) / 2) 的值。
代码超过 1000 个单词:
unsigned long ignoreEverySecondBit(unsigned long value, bool odd, unsigned int countBits)
{
unsigned long result = 0;
unsigned long mask = odd == true ? 0b1 : 0b10;
countBits = countBits / 2;
for (int i = 0; i < countBits; ++i)
{
if ((value & mask) != 0)
{
result += std::pow(2, i);
}
mask = mask << 2;
}
return result;
}
//calculate the HEALPix values:
latLonToHealPixNESTED(nSide, theta, phi, &pix);
result.level = level;
result.texture = pix >> (26 - level * 2);
result.u = static_cast<float>(ignoreEverySecondBit(pix, true, 26 - level * 2));
result.v = static_cast<float>(ignoreEverySecondBit(pix, false, 26 - level * 2));
result.u = result.u / pow(2, (26 - level * 2) / 2);
result.v = result.v / pow(2, (26 - level * 2) / 2);
还有一些图片可以显示结果。蓝色值代表textureID,红色值代表U坐标,绿色值代表V坐标:
0级
1 级
2级
3 级
4级
我希望这个解决方案也能对其他人有所帮助。