两个向量的x,y,z值的所有可能组合?

时间:2013-09-09 09:44:17

标签: vector position combinations bounds

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

我需要得到的要点: enter image description here

1 个答案:

答案 0 :(得分: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 - 组件带负号;否则,它带有正号。