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 变量的值来改变三角形的形状和递归的次数。以上代码的运行结果为: