0
import gpdraw.*;
import javax.swing.*;
import java.lang.Math;


public class Koch2 extends JFrame {

SketchPad paper;
DrawingTool pen;

public Koch2() {

    paper = new SketchPad(600, 600);
    pen = new DrawingTool(paper);

}


public void drawKoch(double sL, int level, double length) {

int x = level - 1;
double y = length / 3;

double z = -1.5 * sL;


if (level < 1) {
    pen.up();
    pen.move(z, 0);
    pen.down();
    pen.setDirection(0);
    pen.forward(sL);
}
else {
    pen.up();
    pen.move(z, 0);
    pen.down();
    pen.setDirection(0);
    pen.forward(length / (Math.pow(3, length)));
    pen.setDirection(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnRight(120);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnLeft(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.setDirection(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnRight(120);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnRight(120);
    pen.forward(length / (Math.pow(3, length)));
    pen.setDirection(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnRight(120);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnLeft(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.setDirection(60);
    pen.forward(length / (Math.pow(3, length)));
    pen.turnRight(120);
    pen.forward(length / (Math.pow(3, length)));


    /*pen.setDirection(0);
    pen.forward(length / (Math.pow(3, length)));
    */

    drawKoch((sL), (x) , (y));

}



}

public static void main(String[] args) {

    new Koch2().drawKoch(300, 6, 300);
}
}

このコードのどのセクションに問題がありますか?単一のテンプレート曲線を生成し、それを何度も繰り返して実際の曲線を作成する方法を見つけようとしています。まだ実際のスノーフレークを作成する必要はありません。カーブを理解するまで待つことができます。

4

1 に答える 1

0

pen.forward(length / (Math.pow(3, length)));が直線を描くと仮定すると:

コッホ曲線の形成は再帰的です。レベル n コッホ曲線を描くには、4 つのレベル (n-1) 曲線を描く必要があります。Koch 曲線を描画するための疑似コードは次のようになります。

drawKochCurve (length, level):
    if level = 0:
        drawStraightLine(length)
    else:
        drawKochCurve(length / 3, level - 1)
        turnLeft(60)
        drawKochCurve(length / 3, level - 1)
        turnRight(120)
        drawKochCurve(length / 3, level - 1)
        turnLeft(60)
        drawKochCurve(length / 3, level - 1)

あなたのコードには、再帰呼び出しが 1 つあります。直線を描く代わりに、より小さなコッホ曲線を描く必要があります。ベース ケースにのみ直線を描画します。

于 2012-10-03T05:33:19.703 に答える