我在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位置的每个角落。
我需要得到的要点:
答案 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
- 组件带负号;否则,它带有正号。