可视化项目中程序化查找立方体/超立方体面的算法求助
超立方体面的程序化生成算法
正在开展立方体/超立方体可视化项目,需获取程序化查找立方体/超立方体面的方法。要求n=3和n=4时,每个面为4个连通顶点(示例:
face[0] = [0, 1, 3, 2]),n=3对应6个面,n=4对应48个面。请问是否存在查找n维立方体面的算法?
现有顶点生成代码
JavaScript 代码
function generateVertices() { const numDimensions = parseInt(document.getElementById('numDimensions').value); const numVertices = Math.pow(2, numDimensions); const vertices = []; for (let i = 0; i < numVertices; i++) { const vertex = []; for (let j = 0; j < numDimensions; j++) { const coord = (i & (1 << j)) === 0 ? 1 : -1; vertex.push(coord); } vertices.push(vertex); } console.clear(); console.log(`Number of vertices: ${vertices.length}`); for (let i = 0; i < vertices.length; i++) { console.log(`[${vertices[i].join(', ')}]`); } }
HTML 代码
<label for="numDimensions">Number of dimensions:</label> <input type="number" id="numDimensions" value="3"> <button onclick="generateVertices()">Generate Vertices</button>
核心算法思路
要生成符合要求的4顶点连通面(即2维正方形面),可基于顶点的二进制编码规则推导:
顶点编码规则:顶点编号
i的二进制每一位对应一个维度的坐标——第j位为0时,该维度坐标为1;为1时坐标为-1。比如编号0(二进制000)对应(1,1,1),编号1(二进制001)对应(-1,1,1)。面的生成逻辑:
- 一个2维面由两个固定的维度(记为
a和b,a < b),以及剩余n-2个维度的固定坐标值共同确定。 - 这两个维度的二进制组合
00、01、11、10对应四个连通顶点,按此顺序排列即可得到符合要求的面(如示例中的[0,1,3,2])。 - 若需要n=4时的48个面,只需将每个基础面的顶点顺序反转(如
[2,3,1,0]),即可得到双倍数量的面。
- 一个2维面由两个固定的维度(记为
数量验证:
- n=3时:维度对数量为
C(3,2)=3,每个维度对对应2^(3-2)=2种固定维度组合,总面数3*2=6,符合要求。 - n=4时:维度对数量为
C(4,2)=6,每个维度对对应2^(4-2)=4种固定维度组合,基础面数为6*4=24;添加反转面后总面数为24*2=48,匹配需求。
- n=3时:维度对数量为
面生成实现代码
在现有代码基础上,添加面生成函数并更新HTML:
新增JavaScript函数
function generateFaces() { const numDimensions = parseInt(document.getElementById('numDimensions').value); const faces = []; // 遍历所有维度对 (a, b),a < b for (let a = 0; a < numDimensions; a++) { for (let b = a + 1; b < numDimensions; b++) { // 遍历剩余n-2个维度的所有固定组合 const fixedBitsCount = numDimensions - 2; const numFixedCombinations = Math.pow(2, fixedBitsCount); for (let f = 0; f < numFixedCombinations; f++) { // 构建基础顶点编号的掩码 let baseMask = 0; let bitPos = 0; for (let d = 0; d < numDimensions; d++) { if (d !== a && d !== b) { // 将f的第bitPos位映射到维度d的位置 if (f & (1 << bitPos)) { baseMask |= (1 << d); } bitPos++; } } // 生成四个连通顶点的编号 const v0 = baseMask; // 维度a和b都是0 const v1 = baseMask | (1 << a); // 维度a是1,b是0 const v2 = baseMask | (1 << b); // 维度a是0,b是1 const v3 = baseMask | (1 << a) | (1 << b); // 维度a和b都是1 // 添加基础面 faces.push([v0, v1, v3, v2]); // 添加反转面(用于n=4时得到48个面) faces.push([v2, v3, v1, v0]); } } } console.clear(); console.log(`Number of faces: ${faces.length}`); for (let i = 0; i < faces.length; i++) { console.log(`face[${i}] = [${faces[i].join(', ')}]`); } }
更新后的HTML代码
<label for="numDimensions">Number of dimensions:</label> <input type="number" id="numDimensions" value="3"> <button onclick="generateVertices()">Generate Vertices</button> <button onclick="generateFaces()">Generate Faces</button>
内容的提问来源于stack exchange,提问作者Lars-Lasse
相关产品推荐
相关产品推荐

