我在 Unity 中使用 c#(尽管这个问题不是特定于任何一个)并且需要获取两个向量的所有可能组合:
(x, y, z) 和 (-x, -y, -z)
所以结果将是: (x, y, z) (-x, y, z) (-x, -y, z) (-x, -y, -z) (x, -y, z) (x , -y, -z) (x, y, -z) (-x, y, -z)
我知道 x、y 和 z。原点位于立方体的中心,我只需要获取立方体 x、y、z 位置的每个角。
我需要得到的积分:
我在 Unity 中使用 c#(尽管这个问题不是特定于任何一个)并且需要获取两个向量的所有可能组合:
(x, y, z) 和 (-x, -y, -z)
所以结果将是: (x, y, z) (-x, y, z) (-x, -y, z) (-x, -y, -z) (x, -y, z) (x , -y, -z) (x, y, -z) (-x, y, -z)
我知道 x、y 和 z。原点位于立方体的中心,我只需要获取立方体 x、y、z 位置的每个角。
我需要得到的积分:
制作八种组合的最简单、最快和最容易理解的方法是对八种符号组合进行硬编码:
IList<int[]> MakeCombinations(int x, int y, int z) {
return new[] {
new[] { x, y, z}
, new[] { x, y, -z}
, new[] { x, -y, z}
, new[] { x, -y, -z}
, new[] {-x, y, z}
, new[] {-x, y, -z}
, new[] {-x, -y, z}
, new[] {-x, -y, -z}
};
}
如果您喜欢更多编程的解决方案,您可以这样做(我使用数组作为向量;您可以使用您的特定类):
int[] data = new[] {x, y, z};
IList<int[]> all = new List<int[]>();
for (int mask = 0 ; mask != 8 ; mask++) {
int[] next = new[] {data[0], data[1], data[2]};
if ((mask & 0x01) != 0) next[0] *= -1;
if ((mask & 0x02) != 0) next[1] *= -1;
if ((mask & 0x04) != 0) next[2] *= -1;
all.add(next);
}
矢量分量前面的正负组合用单个三位数字建模mask
。当位置位N
被设置时,N
第-个分量带负号;否则,取正号。