java用swing,用递归的方法来画谢尔宾斯基三角形
思想:每次给定一个三角形,先算出各中点坐标,然后把它分成4个小三角形,当上小三角形,左小三角形、右小三角形画好时,中间的第四个三角形也自动画好了。
源码:
package base;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class SierpinskiTriangle extends JFrame{
//放置文本域的面板
JPanel DegreePanel=new JPanel();
//用于画图的JPanel面板
TrianglePanel TP=new TrianglePanel();
public SierpinskiTriangle() {
DegreePanel.add(new JLabel("请输入循环次数(10次以内)"));
JTextField jtf=new JTextField("0",5);
//面板添加文本域
DegreePanel.add(jtf);
//文本域添加监听器
jtf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TP.setDegree(Integer.parseInt(jtf.getText()));
}
});
//在框架里面添加画图面板和文本域面板
add(DegreePanel,BorderLayout.SOUTH);
add(TP);
}
//内部类继承画板,用来画三角形
static class TrianglePanel extends JPanel{
//degree表示循环的次数
private int degree=0;
//设置循环的次数
public void setDegree(int de) {
this.degree=de;
//调用paintComponent()
repaint();
}
//参数g可以理解为画笔
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//计算大三角形所需的3个点
//getWeight()、getHeight()分别获得整个显示窗口的宽和长
Point p1=new Point(getWidth()/2,15);
Point p2=new Point(15,getHeight()-15);
Point p3=new Point(getWidth()-15,getHeight()-15);
//画三角形主要方法
paintTriangle(p1,p2,p3,degree,g);
}
private void paintTriangle(Point p1, Point p2, Point p3,
int degree, Graphics g) {
if(degree>=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);
//计算三个中点坐标
Point p12=midPoint(p1,p2);//计算p1和p2的中点p12
Point p13=midPoint(p1,p3);//计算p1和p3的中点p13
Point p23=midPoint(p2,p3);//计算p2和p3的中点p23
//递归画三角形
paintTriangle(p1,p12,p13,degree-1,g);//画上部分的三角形
paintTriangle(p12,p2,p23,degree-1,g);//画左下角的三角形
paintTriangle(p13,p23,p3,degree-1,g);//画右下角的三角形
}
}
//计算中点坐标的方法
private 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 SierpinskiTriangle();
frame.setTitle("搞了很久才完成的递归三角形");
frame.setSize(600,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
运行结果:输入递归次数或三角形
程序开始时结果如上:
循环次数为1时,结果如上
循环次数为4时,结果如上:
循环次数为10时,结果如上