用Java的swing递归画画谢尔宾斯基三角形

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时,结果如上

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值