Java畫布的簡化,儲存迭代遞迴畫圖
阿新 • • 發佈:2018-12-19
基於前面一直在寫這個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,所以每次一旦改變窗體大小或者把它收到最小化,他就會重繪預設的介面,沒有儲存我們畫出的圖形。那麼我們就會想辦法儲存我們畫的圖形,首先我們要知道儲存的內容是什麼:換個角度來說,我們是怎麼畫出來這個圖形。
- 儲存座標
- 儲存畫的方法
- 儲存顏色
- 重繪 所以我們可以設計一個類,用來寫一些繪畫方法。
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);
}
}
這個畫出的一個是雪花,但是不知道為啥我只畫出了半個雪花。若讀者知道為啥可以給我留個言。/哭笑不得