为了理解行进立方体算法,我遵循了以下页面: http://paulbourke.net/geometry/polygonise/
我有一些问题: 什么做按位&和|是什么意思?,以及它们如何使用边缘表来找到正确的tringles?
if(grid.val [0]< isolevel)cubeindex | = 1;
if(edgeTable [cubeindex]& 1) vertlist [0] = VertexInterp(ISOLEVEL,grid.p [0],grid.p [1],grid.val [0],grid.val [1]);
答案 0 :(得分:1)
不打算读那篇文章。但是在这里你可以找到位运算符如何工作https://en.wikipedia.org/wiki/Bitwise_operations_in_C。 `
cubeindex |= 1 --> cubeindex = cubeindex | 1.
例如cubeindex = 26(binary 11010
)和1(binary 00001
)
11010 | 00001 = 11011
这里你广告一个26-> 27。
对于以下edgeTable[cubeindex] & 1
:
例如cubeindex = 17(binary 10001
)\
10001 & 00001 = 00001
这变为1.在if语句中使用,这只是检查数字edgeTable[cubeindex]
是否包含位00001
并相应地返回true或false。
希望这有助于:)
干杯
答案 1 :(得分:0)
按位& (和)和| (或)对整数值内的所有位进行操作。它独立地对每个位进行操作,并且通常与您一起使用,它具有一组布尔值(表示标志),用于指示各种对象的状态。它也可以使用(如在您的示例中)或测试特定标志而不修改其他标志。
整数中的位表示两个值的幂。如果该位设置为true,那么2的幂将包含在其值中。如果该位为false,则不包含该位。最低有效位b0表示2 ^ 0,位1表示2 ^ 1,依此类推。
例如,二进制值5 = 101,因为5 = 2 ^ 2 + 2 ^ 0 = 4 + 1 = 5
如果任一操作数在该位置包含一个操作数,则按位OR通过将结果中的位设置为1来工作。当且仅当两个操作数在该位置都有1时,按位AND通过将每个位设置为1来工作。
例如:
Bitwise OR: 5 | 9 = 0101 | 1001 = 1101
Bitwise AND: 5 & 9 = 0101 & 1001 = 0001
使用这些运算符,如果cubeindex中的位值集表示一组状态(true或false值),则可以使用相同的按位操作数进行测试,如果特定状态为true,则忽略其他位。
在你的例子中:
cubeindex |= 1
将cubeindex中的最低有效位设置为true(1),无论之前是什么。这是因为任何位值与0的按位OR是相同的位值,而任何位值1的按位OR始终为1,因此与将该位设置为1相同,无论其先前的stae如何。它相当于:
cubeindex = cubeindex | 000000000000000001 = cubeindex,b0设置为1
逻辑AND用于测试edgeTable [cubeindex]的最低有效位是否等于1.条件仅在该值的b0为1时才为真。为什么?因为其他位无关紧要,因为它们是按位AND并且为零,这始终为零。
edgeTable [cubeindex]& 1 =位0的值