1

我的程序中有一个 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 度旋转到达。

有多少旋转的物体?如何迭代该组旋转对象?

4

2 回答 2

0

这样做的问题是旋转的顺序很重要,并且您可以通过不同的方式达到相同的状态,这就是嵌套循环不起作用的原因(它们为您提供 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)

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

于 2013-09-01T11:19:39.600 回答
-1

如前所述,三个 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.

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

于 2013-09-01T02:46:20.247 回答