Koch科赫雪花的实现

科赫曲线是一条线。雪花就是从三条线开始

package 科赫雪花;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class kehe_snow extends JFrame{
	final static JSlider js = new JSlider(1,10,5);
	private int width=600;
	private int count;
	double x1,y1,x2,y2,x3,y3;
	double PI=Math.PI;
	private Graphics g;
	
	
	
	public void showUI(int count){
		

		this.setSize(new Dimension(width,width));
		this.setTitle("科赫雪花");
		this.setVisible(true);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		g=this.getGraphics();
		
		FlowLayout fl = new FlowLayout();
		this.setLayout(fl);
		
		count=js.getValue();
		this.add(js);
		js.addChangeListener(new ChangeListener() {
			
			@Override
			public void stateChanged(ChangeEvent e) {
				// TODO Auto-generated method stub
				update();
			}
		});
		
		this.addMouseListener(new MouseAdapter() {
			//只需要重写需要的方法即可,因为父类不是接口:
			//鼠标按下时的点的坐标
			public void mouseReleased(MouseEvent e) {
				draw(e);
			}
		});
		
		
	}
	public void update(){
		repaint();
	}
	
	public static void main(String[]args){
		kehe_snow ks = new kehe_snow();
		ks.showUI(js.getValue());
		
	}
	//雪花就是三个科赫曲线,引用三次递归即可
	public void draw(MouseEvent e){

		x1=width/4;
		y1=width/4;
		x2=width*3/4;
		y2=width/4;
		x3=width/2;
		y3=(1+Math.sqrt(3))*width/4;
		draw_digui(g,x2,y2,x1,y1,js.getValue());
		draw_digui(g,x3,y3,x2,y2,js.getValue());
		draw_digui(g,x1,y1,x3,y3,js.getValue());
		
		
			
	}
	public void draw_digui(Graphics g,double x1,double y1,double x2,double y2,int count){
		
		double x3,y3,//第一个三等分点
				x5,y5,//第二个三等分点
				x4,y4,//顶点
				l,theta;//正三角形底边长和角度
		
		if(count<=1){
			g.drawLine((int)x1,width-(int)y1,(int)x2,width-(int)y2);//由于转换了坐标系,所以相应的要转换会原来以右上角为坐标原点的坐标系,只需要变化Y的值即可
			
		}else{
				//第一个三等分点
				x3 = x1+(x2-x1)/3;
				y3 = y1+(y2-y1)/3;
				
				//第二个三等分点
				x5= x2-(x2-x1)/3;
				y5= y2-(y2-y1)/3;
				
				//求三角形边长和三角形底边的倾斜角
				l=Math.sqrt((y5-y3)*(y5-y3)+(x5-x3)*(x5-x3));
				theta=Math.atan((y5-y3)/(x5-x3));
				
				//对角的条件的限制
				if((theta>=0) && ((x5-x3)<0)||(theta<=0)&&((x5-x3)<0)){
					theta=theta+PI;
				}
				
				//顶点
				x4=x3+Math.cos(theta+PI/3)*l;
				y4=y3+Math.sin(theta+PI/3)*l;
				
				
				
				count--;
				draw_digui(g,x1,y1,x3,y3,count);
				draw_digui(g,x3,y3,x4,y4,count);
				draw_digui(g,x4,y4,x5,y5,count);
				draw_digui(g,x5,y5,x2,y2,count);

		
		}
		
	
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值