1

我在 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 位置的每个角。

我需要得到的积分: 在此处输入图像描述

4

1 回答 1

1

制作八种组合的最简单、最快和最容易理解的方法是对八种符号组合进行硬编码:

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第-个分量带负号;否则,取正号。

于 2013-09-09T09:49:48.937 回答