谢尔宾斯基三角形

时间:2016-03-20 02:18:50

标签: java swing fractals

第k个Sierpinski三角形是一个三角形,其内部细分如下:

  1. 取三角形边的三个中点。这些点构成了 内接三角形的顶点,黑色。
  2. 剩余的3个内接三角形是第(k-1)个Sierpinski三角形。完成drawTriangle的代码 SierpinskiTriangle类中的方法以及Sierpinski程序输出的屏幕截图,用于k = 4.
  3. 我真的在这里苦苦挣扎,我写了这段代码,但它没有给我我需要的东西,任何帮助和一步一步的解释都会非常有帮助。我的三角形不会停留,它会在一段时间后消失。提前谢谢

    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);
        }
    }
    

2 个答案:

答案 0 :(得分:3)

在基本情况下摆脱固定大小的三角形。 你必须改变这个:

        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);

Sierpinski Triangle, 9 level recursion

答案 1 :(得分:1)

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

new Sierpinski_Triangle(1);

但是你的递归基础是if (levels == 2),所以你的程序基本挂起,因为关卡会变成“-infinity”。

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