1. 程式人生 > >Java畫布的簡化,儲存迭代遞迴畫圖

Java畫布的簡化,儲存迭代遞迴畫圖

基於前面一直在寫這個Java畫布,我們發現一個特點,那就是按鈕好多,顏色好多,所以本節就是要簡化我們的畫布程式,從而也實現一個複習。 1.關於簡化 相信學過程式語言的同學都知道陣列,因為不同的圖形,不同的顏色就要建立一個按鈕,所以我們想能不能建立一個按鈕的陣列呢!如下:

  String[] shape={"直線1","直線2","矩形","三角形","橢圓","多邊形","曲線","橡皮擦","迭代","遞迴"};
  Color[] color={Color.BLACK,Color.LIGHT_GRAY,Color.GREEN,Color.GRAY,Color.PINK};

在這裡插入圖片描述 加按鈕顏色的時候直接一個for迴圈即可。

		for(int i=0;i<shape.length;i++)
		{
			JButton jbu=new JButton(shape[i]);
			jp.add(jbu);
			jbu.addActionListener(mouse);
		}
		for(int i=0;i<color.length;i++)
		{
			JButton jbu=new JButton();
			jbu.setBackground(color[i]);
			jbu.setPreferredSize(new Dimension(30,30));
			jp.add(jbu);
			jbu.addActionListener(mouse);
		}

簡化就到這。 2.儲存 JFrame裡面有個預設的繪圖法pait,所以每次一旦改變窗體大小或者把它收到最小化,他就會重繪預設的介面,沒有儲存我們畫出的圖形。那麼我們就會想辦法儲存我們畫的圖形,首先我們要知道儲存的內容是什麼:換個角度來說,我們是怎麼畫出來這個圖形。

  1. 儲存座標
  2. 儲存畫的方法
  3. 儲存顏色
  4. 重繪 所以我們可以設計一個類,用來寫一些繪畫方法。
public class Shape {
	private Shape[] arrayShape=new Shape[9000];
	private int x1,x2,y1,y2;
	private String name;
	private Color color;
	public Shape(int x1,int y1,int x2,int y2,String name,Color color)
	{
		this.x1=x1;
		this.x2=x2;
		this.y1=y1;
		this.y2=y2;
		this.name=name;
		this.color=color;
	}
	public void drawShape(Graphics g)
	{
		switch(name)
		{
			case "直線":
				g.setColor(color);
				g.drawLine(x1, y1, x2, y2);
				
				break;
			case "矩形":
				g.setColor(color);
				g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));
				break;
			case "橢圓":
				g.setColor(color);
				g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));
				System.out.println("000");
				break;
			case "橡皮擦":
				g.setColor(color);
				g.drawRect(x1, y1, x2, y2);
				break;
		}
	}
}

PS:在這裡提一下this的用法,this很簡單,就是表示本來的意思。 當我們儲存的時候就類似這樣:

		if ("直線1".equals(name)) {
			gr.drawLine(x1, y1, x2, y2);
			Shape shape=new Shape(x1,y1,x2,y2,"直線",color);
			arrayShape[index++]=shape;
		}

一個圖形陣列來儲存

	private Shape[] arrayShape=new Shape[9000];

重繪方法需要把數組裡的內容全畫出來

	public void paint(Graphics g)
	{
		super.paint(g);
		for(int i=0;i<arrayShape.length;i++)
		{
			Shape shape= arrayShape[i];
			if(shape!=null)
				shape.drawShape(g);
			else
				break;
		}
	}

就這樣大功告成了,也許講得也沒有那麼清晰,歡迎留言。 3.畫迭代遞迴圖形 (1)迭代 在這裡插入圖片描述

	public void iterate(double x,double y)
	{
		a=-1.2;b=1.6;c=-1;d=-1.5;
		for(int i=0;i<25500;i++)
		{
			double tex=Math.sin(a*y)+c*Math.cos(a*x);
			double tey=Math.sin(b*x)+c*Math.cos(b*y);
			int x3=(int)(tex*130+400);
			int y4=(int)(tey*130+400);
			gr.setColor(new Color(i/20,i/100,i/100));
			gr.drawLine(x3, y4, x3, y4);
			x=tex;
			y=tey;
		}
	}
根據abcd的值不同,迭代圖形也不同;你們可以自己嘗試一下

遞迴

	public void drawkoach(Graphics g,double a,double b,double c,double d,int count)
	{
		if(count<=1)
		{
			g.drawLine((int)a,(int)b,(int)c,(int)d);
		}
		else
		{
			double x6=(2*a+c)/3;
			double y6=(2*b+d)/3;
			double x4=(a+2*c)/3;
			double y4=(b+2*d)/3;
			double k=(a-c)*(b-d);
			double x5=a,y5=b;
			if(y6==y4)
			{
				x5=(x6+x4)/2;
				y5=y6-(x4-x6)*Math.sqrt(3)/2;
			}
			else if(k<0)
			{
		           x5 = a;
		           y5 = y4;
			}
			else if(k>0)
			{
		           x5 = c;
		           y5 = y6;
			}
			if(x6==x4)
			{
				x5=x6;
				y5=y6;
			}
			drawkoach(g,x6,y6,x5,y5,count-1);
			drawkoach(g,x5,y5,x4,y4, count-1);
			drawkoach(g,a,b,x6,y6, count-1);
			drawkoach(g,x4,y4,c,d, count-1);
		}
	}

這個畫出的一個是雪花,但是不知道為啥我只畫出了半個雪花。若讀者知道為啥可以給我留個言。/哭笑不得