【问题标题】:Error in Turtle recursionTurtle 递归中的错误
【发布时间】:2017-03-31 22:08:02
【问题描述】:

我正在尝试使用 Turtle Graphics 通过递归制作分形,但由于某种原因,我的代码似乎没有将 Turtle 返回到原点。 我的代码如下

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

我的目标是让乌龟回到每个“太阳”的中心,但有些东西不起作用。

【问题讨论】:

    标签: recursion turtle-graphics


    【解决方案1】:

    虽然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
        }
    }
    

    输出

    注意:我使用 Python turtle 进行了模拟,因此如果出现错误,您可能需要调整我的 Java 代码。

    【讨论】:

    • 啊,好的!谢谢!
    • @willizen,我已经更新了这个答案,使其在设计上更接近您的原始设计,其中大部分线条被移除并修改了一个计算。
    【解决方案2】:

    您的 8 辐条环在每个辐条后将笔留在图形的中心。在循环结束时,从中心开始,执行以下序列:

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

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

    【讨论】:

    • @willizen,我无法按照描述完成这项工作——你可以吗?此更改保留了原始返回中心不足的问题,并且需要对其他子程序进行修改。我相信问题不仅仅是方向,即在回程计算中缺少r / 4 距离单位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2023-03-13
    • 2016-06-05
    • 2017-04-25
    相关资源
    最近更新 更多