2012-01-18 9 views
3

このkochの雪片描画を再帰的に行うことはできません。再帰的に描画する

再帰的な方法

public void koch(int n, double size) { 
    if (n == 0) { 
     t.forward(size); 
    } else { 

     koch(n - 1, size/3); // line 1 
     stdTort.rotate(60);   // line 2 
     koch(n - 1, size/3);  // line 3 
     stdTort.rotate(120);   // line 4 
     koch(n - 1, size/3);  // line 5 
     stdTort.rotate(60);   // line 6 
     koch(n - 1, size/3);  // line 7 
    } 
} 

任意の助けいただければ幸いです。

+0

は、それはVB(Visual Basicの)言語のためのタグです以上5 –

+0

を追加傾けます。間違いなく、あなたが4つの異なるプログラミング言語でこの質問に無作為にタグ付けしたという事実を指し示す言葉は、明らかに1つしか使用していないときです。 –

+0

これはアルゴリズムの問​​題なので、どの言語でもそれを正しく解決できるはずですか? –

答えて

1

あなたのアングルは、時計回りに反時計回りに回転することが予想されるため、角度が間違っています。あなたが実際にあなたが-60を回転させるようにしたいあなたの最後の行を取得するには次に120、いない60を回転させる必要がある図2に示す角度を得るためには、いない60本について考える

koch(n - 1, size/3); // line 1 
    t.rotate(120);   // line 2 
    koch(n - 1, size/3);  // line 3 
    t.rotate(120);   // line 4 
    koch(n - 1, size/3);  // line 5 
    t.rotate(-60);   // line 6 
    koch(n - 1, size/3);  // line 7 

、私は思いますあなたが混乱している理由は、回転が直感的ではないように思われるからです。あなたのカメが最初の行を進んでいる場合は、その方向から時計回りまたは反時計回りのいずれかの回転が予想されます。しかし、あなたの回転はすべて逆の方向から始まるようです。期待

 /
-60 = -- 

+60 = -- 
     \ 

実際:

-60 = -- 
    /

     \ 
+60 = -- 
+0

もし私が2行目を "-120"に変更すると、私は図2を得るが、図3はまだ解決されていない。私が線4に対して120を保持すると、図3に示すように描画に傾きが生じず、直線になります。 –

+0

@jonny [Math.sin()]に渡す前に度をラジアンに変換していますか(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#sin (ダブル))? –

+0

@jonny方向はどのような値で始まりますか?また、回転方法を表示できますか? – DaveJohnston

0

反時計回りに回転させる場合は、t.rotate(-120)が必要です。

関連する問題