2017-03-31 36 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