2017-03-31 38 views
1

我正在尝试使用海龟图形通过递归形成一个分形,但由于某种原因,我的代码似乎没有将龟背回到原点。 我的代码如下海龟递归中的错误

public static void sun(Turtle t, double radius) { 
for (int i = 0; i < 360; i++) { 
    t.forward(radius * .0174); 
    t.left(1); 
} 
    t.penup(); 
    t.left(90); 
    t.forward(radius); 
    //t.fill(); 
    t.pendown(); 
for (int i = 0; i < 8; i++) { 
    t.forward(2*radius); 
    t.backward(2*radius); 
    t.left(45); 
} 
t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 
} 

public static void fractalSun(Turtle t, double r, int level) { 
int color; 
if (level == 0) { 
    t.color(255, 0, 0); 
    sun(t, r); 
} 
else { 
    sun(t, r); 
    t.left(90); 
    t.forward(r); 
    t.right(90); 
    t.forward(r * 2); 
    t.right(90); 
    fractalSun(t, r/4, level -1); 
    t.left(90); 
    t.backward(r * 2); 
} 
} 

的代码编译成功,但会产生这样的图像: Screenshot

我的目标是为龟返回各自的“太阳”的中心,但是东西ISN”不工作。

回答

0

您的8辐圈在每次发言后都会将笔放在图的中央。在循环结束后,开始了中心,执行这个序列:

t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 

特别是,备份一个半径;我认为这就是你要达到预期目标的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。

+0

@willizen,我不能像描述的那样完成这项工作 - 可以吗?这种改变保留了原来返回中心不足的问题,并需要修改其他子程序。我相信问题不仅仅在于方向,即在回程计算中缺少'r/4'单位的距离。 – cdlane

0

虽然sun()方法将乌龟返回到它开始的位置,但fractalSun()方法会将乌龟留在图的中心。所以不管是fractalSun()自己还是sun()都必须做出调整。下面是用更少的变化(主要是删除)更新修复:

变化的代码sun()这最后一块:

t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 

是简单的一个说法:

// t.penup(); 
// t.backward(radius); 
t.right(90); 
// t.pendown(); 

降三行代码从fractalSun()并将参数更改为最终函数调用:

public static void fractalSun(Turtle t, double r, int level) { 

    if (level == 0) { 
     t.color(255, 0, 0); 

     sun(t, r); 
    } else { 
     sun(t, r); 

     // t.left(90); 
     // t.forward(r); 
     // t.right(90); 

     t.forward(r * 2); 
     t.right(90); 
     fractalSun(t, r/4, level - 1); 
     t.left(90); 
     t.backward(r * 2 + r/4); // added a term to the equation 
    } 
} 

输出

enter image description here

注:我这个模拟使用Python乌龟,所以你可能需要调整我的Java代码,如果是不对劲。

+0

啊,好的!谢谢! – willizen

+0

@willizen,我已经更新了这个答案,以便在设计中更接近您的原版,主要是删除了一些线条,并修改了一个calcualtion。 – cdlane