3

我试图在 Java 中递归地绘制谢尔宾斯基的三角形,但它不起作用,尽管对我来说逻辑似乎很好。基本情况是当三角形彼此相距在 2 个像素以内时,因此使用距离公式。

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.awt.Canvas;

public class Triangle extends Canvas implements Runnable
{
    private static final int WIDTH = 800;
    private static final int HEIGHT = 600;


public Triangle()
{
    setBackground(Color.WHITE);
}

public void paint( Graphics window )
{
    window.setColor(Color.BLUE);
    window.setFont(new Font("ARIAL",Font.BOLD,24));     
    window.drawString("Serpinski's Gasket", 25, 50);

    triangle(window, (WIDTH-10)/2, 20, WIDTH-40, HEIGHT-20, 40, HEIGHT-20, 4);
}

public void triangle(Graphics window, int x1, int y1, int x2, int y2, int x3, int y3, int r)
{


    //if statement base case
        //midpoint = (x1 + x2 / 2), (y1 + y2/ 2)
        if(Math.sqrt((double)(Math.pow(x2-x1, 2)) + (double)(Math.pow(y2-y1, 2))) > 2)
        //if(r==0)
        {
            window.drawLine(x1, y1, x2, y2);     
            window.drawLine(x2, y2, x3, y3);
            window.drawLine(x3, y3, x1, y1);
        }

        int xa, ya, xb, yb, xc, yc;   // make 3 new triangles by connecting the midpoints of
        xa = (x1 + x2) / 2;             //. the previous triangle 
        ya = (y1 + y2) / 2;
        xb = (x1 + x3) / 2;
        yb = (y1 + y3) / 2;
        xc = (x2 + x3) / 2;
        yc = (y2 + y3) / 2;


        triangle(window, x1, y1, xa, ya, xb, yb, r-1);   // recursively call the function using the 3 triangles
        triangle(window, xa, ya, x2, y2, xc, yc, r-1);
        triangle(window, xb, yb, xc, yc, x3, y3, r-1);

}

public void run()
{
    try{
        Thread.currentThread().sleep(3);    
    }
    catch(Exception e)
    {
    }
}
}

跑步者是

import javax.swing.JFrame;

public class FractalRunner extends JFrame
{
    private static final int WIDTH = 800;
    private static final int HEIGHT = 600;

public FractalRunner()
{
    super("Fractal Runner");

    setSize(WIDTH+40,HEIGHT+40);

    getContentPane().add(new Triangle());   

    setVisible(true);
}

public static void main( String args[] )
{
    FractalRunner run = new FractalRunner();
}
}

对我来说,这应该可行,但它会导致我不知道如何纠正的运行时/StackOverFlow 错误。有什么帮助吗?

4

3 回答 3

2

您需要在分离的条件检查中将递归调用移动到三角形以及相关的数学。现在,它总是会调用它,因此你会得到堆栈溢出。

于 2013-02-16T02:06:25.140 回答
0

您的基本情况可能无法正常工作 - 如果两个三角形之间的距离从来不是两个像素怎么办?假设我们将 y1 和 x1 设为 0 和 200。它们的中点为 100,然后 50、25、12、6、3、1<--- 永远不会达到 2 像素的基本情况...

于 2013-11-06T02:58:36.643 回答
0

“StdDraw”取自这里

public class Sierpinski {

    public static void sierpinski(int n) {
        sierpinski(n, 0, 0, 1);
    }

    public static void sierpinski(int n, double x, double y, double size) {

        if (n == 0) return;

        //compute triangle points
        double x0 = x;
        double y0 = y;
        double x1 = x0 + size;
        double y1 = y0;
        double x2 = x0 + size / 2;
        double y2 = y0 + (Math.sqrt(3)) * size / 2;

        // draw the triangle        
        StdDraw.line(x0, y0, x1, y1);
        StdDraw.line(x0, y0, x2, y2);
        StdDraw.line(x1, y1, x2, y2);
        StdDraw.show(100);

        //recursive calls
        sierpinski(n-1, x0, y0, size / 2);
        sierpinski(n-1, (x0 + x1) / 2, (y0 + y1) / 2, size / 2);
        sierpinski(n-1, (x0 + x2) / 2, (y0 + y2) / 2, size / 2);
    }

    // read in a command-line argument n and plot an order Sierpinski Triangle
    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        StdDraw.setPenRadius(0.005);
        sierpinski(n);
    }
}

盖伊

于 2015-12-10T09:14:47.857 回答