如何用位运算通过循环快速生成长方体的8个顶点?
长方体顶点生成的位运算实现
核心思路
8个长方体顶点正好对应3位二进制数(000 ~ 111),我们可以用顶点序号n的二进制位直接控制每个维度的加减系数:
- 把
n的二进制第dim位作为判断条件:位为1时系数取1(加半长),位为0时取-1(减半长) - 通过位运算
(n >> dim) & 1快速提取对应位的值,避免手动枚举所有顶点的符号组合
代码实现
假设用C++风格代码实现,核心逻辑如下:
// 整理长方体的尺寸数组 float dimensions[] = { cub.width, cub.height, cub.depth }; Vec3 points[8]; // 嵌套循环生成所有顶点 for (int n = 0; n < 8; ++n) { for (int dim = 0; dim < 3; ++dim) { // 提取n的第dim位,判断符号 bool usePositive = ((n >> dim) & 1) != 0; int coeff = usePositive ? 1 : -1; points[n][dim] = cub.center[dim] + coeff * dimensions[dim] / 2.0f; } }
位运算解释
n >> dim:将顶点序号n的二进制值右移dim位,把目标位移到最低位& 1:和1做按位与操作,保留最低位的值(0或1),以此确定当前维度是加还是减半长
举个例子,顶点序号n=5(二进制101):
- dim=0(x轴):
(5 >> 0) & 1 = 1→ 加x方向半宽 - dim=1(y轴):
(5 >> 1) & 1 = 0→ 减y方向半高 - dim=2(z轴):
(5 >> 2) & 1 = 1→ 加z方向半深
简化优化
如果想减少嵌套层级,也可以直接展开维度循环(仅3个维度,代码量可控):
float dimensions[] = { cub.width, cub.height, cub.depth }; Vec3 points[8]; for (int n = 0; n < 8; ++n) { points[n][0] = cub.center[0] + (((n >> 0) & 1) ? 1 : -1) * dimensions[0] / 2.0f; points[n][1] = cub.center[1] + (((n >> 1) & 1) ? 1 : -1) * dimensions[1] / 2.0f; points[n][2] = cub.center[2] + (((n >> 2) & 1) ? 1 : -1) * dimensions[2] / 2.0f; }
内容的提问来源于stack exchange,提问作者Lnio Yarschov
相关产品推荐
相关产品推荐

