Algorithm 我可以将3D实体旋转90度。如何迭代所有可能的旋转?

Algorithm 我可以将3D实体旋转90度。如何迭代所有可能的旋转?,algorithm,3d,rotation,iteration,Algorithm,3d,Rotation,Iteration,我的程序中有一个3D对象的模型。我可以将它沿坐标系的轴旋转90度。我可以为每次旋转选择轴。我可以一个接一个地旋转几圈 例如,我可以做: object = create_3d_obj(); rotated_ob = rotate_90_degrees(object, X_axis); even_more_rob = rotate_90_degrees(rotated_ob, X_axis); very_heavily_rob = rotate_90_degrees(even_more_rob, Y

我的程序中有一个3D对象的模型。我可以将它沿坐标系的轴旋转90度。我可以为每次旋转选择轴。我可以一个接一个地旋转几圈

例如,我可以做:

object = create_3d_obj();
rotated_ob = rotate_90_degrees(object, X_axis);
even_more_rob = rotate_90_degrees(rotated_ob, X_axis);
very_heavily_rob = rotate_90_degrees(even_more_rob, Y_axis);
但是,(如预期的)沿同一轴旋转4次90度会产生原始对象。这就给我留下了一组有限的旋转物体,我可以通过90度的旋转到达它们


有多少旋转的物体?如何在旋转的对象集合上进行迭代?

如前所述,三个for循环可以完成这项工作

与常规for循环不同,退出时需要重置每个轴的旋转状态

for ( int drx = 0 ; drx < 4 ; ++ drx )
{
    rotate_90_degrees(object, X_axis);
    for ( int dry = 0 ; dry < 4 ; ++ dry )
    {
        rotate_90_degrees(object, Y_axis);
        for ( int drz = 0 ; drz < 4 ; ++ drz )
        {
            rotate_90_degrees(object, Z_axis);
            //do something with this iteration!
        }
        rotate_90_degrees(object, Z_axis);
    }
    rotate_90_degrees(object, Y_axis);
}
rotate_90_degrees(object, X_axis); //if you want the state to be restored to original, add this.
for(int-drx=0;drx<4;++drx)
{
旋转90度(对象,X轴);
对于(int-dry=0;dry<4;++dry)
{
旋转90度(对象,Y轴);
对于(int-drz=0;drz<4;++drz)
{
旋转90度(对象,Z轴);
//用这个迭代做点什么!
}
旋转90度(对象,Z轴);
}
旋转90度(对象,Y轴);
}
旋转90度(对象,X轴)//如果要将状态还原为原始状态,请添加此项。

现在,这只是按照您的要求进行迭代,它的第一次迭代从(90,90,90)开始。当然,如果需要,您可以进行一些修改来解决此问题。

问题在于旋转顺序很重要,您可以通过不同的方式达到相同的状态,这就是嵌套循环不起作用的原因(它们提供64个结果,而您只有24个)。因此,您需要从评估中删除现有方向,否则会有重复方向。因此,比较方向是第一项工作,您需要一个表示方向、使用结果和旋转操作输入的定义

然后,Python中查找旋转的一种简单方法是:

result = {}
new = {o0} # starting orientation
while new:
    cur = new.pop()
    # add new orientation to results
    result.add(cur)
    # determine derived orientations from the current one
    # that weren't considered before
    for o in derived_orientations(cur):
        if not o in result:
            new.add(o)

请注意,您也可以使用嵌套循环并从结果中过滤重复项,但这种方法基本上证明了它自己的正确性(如果有无限多个方向,它将无限循环),而嵌套循环对我来说并不明显。

3嵌套
for
循环?