谁能给个谢尔斯基三角形的java代码 直角三角形的像图片这样的

2025-02-23 00:16:41
推荐回答(1个)
回答1:

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

public class Sierpinski extends JApplet {

    private SierpinskiTrianglePanel trianglePanel = 
                            new SierpinskiTrianglePanel();

    public Sierpinski() {

        JPanel panel = new JPanel();
        add(trianglePanel);
        add(panel, BorderLayout.SOUTH);

    }

    static class SierpinskiTrianglePanel extends JPanel {

        // 递归次数
        private int order = 7;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            // 初始三角形的三个顶点,通过更改这三个点的坐标来更改三角形的形状
            Point p1 = new Point(10, 10);
            Point p2 = new Point(10, getHeight() - 10);
            Point p3 = new Point(getWidth() - 10, getHeight() - 10);

            displayTriangles(g, order, p1, p2, p3);
        }

        private static void displayTriangles(Graphics g, int order,
                                Point p1, Point p2, Point p3) {
                                
            // 最后一次递归
            if (order == 0) {
                // 以当前三个顶点画三角形
                g.drawLine(p1.x, p1.y, p2.x, p2.y);
                g.drawLine(p1.x, p1.y, p3.x, p3.y);
                g.drawLine(p2.x, p2.y, p3.x, p3.y);
            } else {
                // 得到三角形三边的中点
                Point p12 = midpoint(p1, p2);
                Point p23 = midpoint(p2, p3);
                Point p31 = midpoint(p3, p1);

                // 递归继续画三角形
                displayTriangles(g, order - 1, p1, p12, p31);
                displayTriangles(g, order - 1, p12, p2, p23);
                displayTriangles(g, order - 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("Sierpinski Triangle");
        Sierpinski applet = new Sierpinski();
        frame.add(applet);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}

题主可以通过更改上述代码的 order 和 p1, p2, p3 变量的值来改变三角形的形状和递归的次数。以上代码的运行结果为: