CloudCompare构建八叉树编码方式

CloudCompare构建八叉树编码方式

  • 在每个维度上的编码
  • 整体编码

在每个维度上的编码

CloudCompare构建八叉树编码方式_第1张图片
根据初始立方体按照1→8逐级向下划分,64位系统的划分最大等级 MAX_OCTREE_LEVEL = 21 ,也就是每个维度被划分成221部分,从原点开始向外编码。编码规律如下:

X维度编码规律:

Created with Raphaël 2.2.0 Code s[3n] == 1? s[3n] == 0;n = n + 1 s[3n] = 1 结束 yes no
  • 这里用数组 s[64] 来表示64位二进制上表示的数字,最低位为s[0]s[n] 表示从低位开始第n位,n∈Z+ ;n==0&&n<=63.

Y维度编码规律:X维度同索引对应二进制code左移1位
Z维度编码规律:X维度同索引对应二进制code左移2位

索引 十进制(X) 二进制(X) 十进制(Y) 二进制(Y) 十进制(Z) 二进制(Z)
0 0 0000 0000 0000 0000 0 0000 0000 0000 0000 0 0000 0000 0000 0000
1 1 ‭0000 0000 0000 0001‬ 2 0000 0000 0000 0010 4 0000 0000 0000 0100
2 8 ‭0000 0000 0000 1000‬ 16 ‭0000 0000 0001 0000 32 0000 0000 0010 0000
3 9 ‭0000 0000 0000 1001‬ 18 ‭0000 0000 0001 0010 36 0000 0000 ‭0010 0100‬
4 64 0000 0000 ‭0100 0000‬ 128 0000 0000 ‭1000 0000‬ 256 0000 ‭0001 0000 0000‬
5 65 0000 0000 ‭0100 0001 130 0000 0000 ‭1000 0010‬ 260 0000 ‭0001 0000 0100‬
6 72 0000 0000 ‭0100 1000‬ 144 0000 0000 ‭1001 0000‬ 288 0000 ‭0001 0010 0000‬
7 73 0000 0000 ‭0100 1001 146 0000 0000 ‭1001 0010‬ 292 0000 ‭0001 0010 0100‬
8 512 ‭0000 0010 0000 0000‬ 1024 0000 ‭0100 0000 0000‬ 2048 0000 ‭1000 0000 0000‬
9 513 0000 0010 0000 0001 1026 0000 ‭0100 0000 0010‬ 2052 0000 ‭1000 0000 0100‬
10 520 ‭0000 0010 0000 1000‬ 1040 0000 0100 0001 0000‬ 2080 0000 1000 0010 0000‬
11 521 0000 0010 0000 1001 1042 0000 0100 0001 0010‬ 2084 0000 1000 0010 0100‬
  • 保存code编码的数据类型是long long,占8字节,这里为方便,表格中列出值较小,只写出了两个字节,前面的0就省略了.

整体编码

整体编码Code = X维度编码 | Y维度编码 | Z维度编码

  • 当所有的点都有其Code编码之后,对点按照Code大小进行排序,使得后面索引位置上相邻的点,在空间上也具有相邻性;方便之后建立LOD
DgmOctree::CellCode DgmOctree::GenerateTruncatedCellCode(const Tuple3i& cellPos)
{
	assert(	cellPos.x >= 0 && cellPos.x < MonoDimensionalCellCodes::VALUE_COUNT
		&&	cellPos.y >= 0 && cellPos.y < MonoDimensionalCellCodes::VALUE_COUNT
		&&	cellPos.z >= 0 && cellPos.z < MonoDimensionalCellCodes::VALUE_COUNT);

	int xIndex = cellPos.x;//点在X方向的索引
	int yIndex = cellPos.y;//点在Y方向的索引
	int zIndex = cellPos.z;//点在Z方向的索引

	//PRE_COMPUTED_POS_CODES.values即是
	long long xIndexValue = PRE_COMPUTED_POS_CODES.values[xIndex];     //点在X方向的编码值
	long long yIndexValue = PRE_COMPUTED_POS_CODES.values[yIndex] << 1;//点在Y方向的编码值
	long long zIndexValue = PRE_COMPUTED_POS_CODES.values[zIndex] << 2;//点在Z方向的编码值
	
	long long code = xIndexValue | yIndexValue | zIndexValue;//计算整体编码

	return code;
}

你可能感兴趣的:(CloudCompare)