谢尔宾斯基三角

Sierpinski triangle

第k个谢尔宾斯基三角形是内部细分如下的三角形:

  1. 取三角形各边的三个中点。这些点构成 黑色内切三角形的顶点。
  2. 剩下的3个内接三角形是第(k-1)个谢尔宾斯基三角形。完成drawTriangle的代码 SierpinskiTriangle class 中的方法和 k = 4 的 Sierpinski 程序输出的屏幕截图。

我在这里真的很挣扎,我写了这段代码但它没有给我我需要的东西,任何帮助和一步一步的解释都会非常有帮助。而我的三角形不停留,过了一会儿就消失了。提前致谢

import java.awt.*;
import javax.swing.*;

public class Sierpinski_Triangle extends JPanel {
    private static int numberLevelsOfRecursion;

    public Sierpinski_Triangle(int numLevels) {
        numberLevelsOfRecursion = numLevels;
    }

    public void paintComponent(Graphics computerScreen) {
        super.paintComponent(computerScreen);
        Point top = new Point(250, 50);
        Point left = new Point(50, 450);
        Point right = new Point(450, 450);
        drawTriangle(computerScreen, numberLevelsOfRecursion, top, left, right);
    }

    /**
     * Draw a Sierpinski triangle
     * 
     * @param screen
     *            the surface on which to draw the Sierpinski image
     * @param levels
     *            number of levels of triangles-within-triangles
     * @param top
     *            coordinates of the top point of the triangle
     * @param left
     *            coordinates of the lower-left point of the triangle
     * @param right
     *            coordinates of the lower-right point of the triangle
     */
    public static void drawTriangle(Graphics g, int levels, Point top, Point left, Point right) {
        /**
         * You must COMPLETER THE CODE HERE to draw the Sierpinski Triangle
         * recursive code needed to draw the Sierpinski Triangle
         */
        Point p1 = top;
        Point p2 = left;
        Point p3 = right;
        if (levels == 2) {
            // base case: simple triangle
            Polygon tri = new Polygon();
            tri.addPoint(250, 50);
            tri.addPoint(50, 450);
            tri.addPoint(450, 450);
            g.setColor(Color.RED);
            g.fillPolygon(tri);
        } else {
            // Get the midpoint on each edge in the triangle
            Point p12 = midpoint(p1, p2);
            Point p23 = midpoint(p2, p3);
            Point p31 = midpoint(p3, p1);
            // recurse on 3 triangular areas
            drawTriangle(g, levels - 1, p1, p12, p31);
            drawTriangle(g, levels - 1, p12, p2, p23);
            drawTriangle(g, levels - 1, p31, p23, p3);
        }
    }

    private static Point midpoint(Point p1, Point p2) {
        return new Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("SierpinskiTriangle");
        Sierpinski_Triangle applet = new Sierpinski_Triangle(1);
        frame.add(applet);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450, 450);
        frame.setVisible(true);
    }
}

您在 main 方法中将 numberLevelsOfRecursion 设置为 1:

new Sierpinski_Triangle(1);

但是你递归的基本情况是if (levels == 2),所以你的程序基本上挂起,因为级别达到“-infinity”。

基础案例中的代码看起来也很奇怪。它基本上在之前绘制的所有内容上绘制了一个红色的大三角形。如果您打算在递归过程开始时将其绘制为图片的某种边框,则不应减少 levels 变量。

去掉基本案例中的那个固定大小的三角形。 你必须改变这个:

        tri.addPoint(250, 50);
        tri.addPoint(50, 450);
        tri.addPoint(450, 450);

        tri.addPoint(p1.x, p1.y);
        tri.addPoint(p2.x, p2.y);
        tri.addPoint(p3.x, p3.y);

为了防止堆栈溢出,您应该更改此设置:

    if (levels == 2) {

对此:

    if (levels <= 2) {

并通过将初始参数设置为高于 1 来添加更多递归级别(否则你只会看到那个大红色三角形):

    Sierpinski_Triangle applet = new Sierpinski_Triangle(5);