画板重绘完整版代码

package com.yzd1209.DrawRepaint;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Board {
    
    
public void ShowDraw() {
    
    
	DrawFrame jf = new DrawFrame();
	//窗体初始化属性
	jf.setSize(800,600);//窗体大小,横x纵y
	jf.setLocationRelativeTo(null);//使窗体显示在屏幕中央
	jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭时即程序退出
	
	//设定流式布局
	FlowLayout flayout = new FlowLayout();
	jf.setLayout(flayout);
	//创建监听事件处理类
	DrawListener dlistener = new DrawListener();
	jf.dlistener=dlistener;//jf是一个DrawFrame的对象其中有一个drawlistener参数   ???
	//将事件处理类dlistener赋值给DrawListener dlistener=null中申明的dlistener;
	
	//给界面加监听 画曲线时既要监听动作即按钮是否被按下(获取按下时坐标)  还要监听鼠标移动(获取实时坐标)
	jf.addMouseListener(dlistener);
	jf.addMouseMotionListener(dlistener);
	
	//增加画图选项 增加到界面上 增加监听
	String[] jname = {
    
    "直线","矩形","曲线","分形图","立体图","三点分形","概率画图","递归直线","九宫格","立体九宫格"};
	for(int i=0;i<jname.length;i++) {
    
    
		JButton jline = new JButton(jname[i]);
		jf.add(jline);
		jline.addActionListener(dlistener);
	}

    //创建颜色数组 增加到界面上 增加监听
	Color[] color = {
    
    Color.RED,Color.GREEN,Color.BLUE};
	for(int i=0;i<color.length;i++) {
    
    
		JButton jcolor = new JButton();
		jcolor.setBackground(color[i]);
		jcolor.setPreferredSize(new Dimension(30,30));
		jf.add(jcolor);
		jcolor.addActionListener(dlistener);
	}


	jf.setVisible(true);//可视化之前是不可以显示Graphics的

	Graphics g = jf.getGraphics();	//增加图形属性g,直接绑定在窗体jf上
	dlistener.g = g;//将上一行Graphics类属性g 赋给监听器对象的属性
} 

public static void main(String[] args) {
    
    
	Board dbroad = new Board();
	dbroad.ShowDraw();
}
}

package com.yzd1209.DrawRepaint;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JButton;

public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{
    
    
	Graphics g = null;//Grahpics不能创建对象,Grahpics是个抽象类  声明一个对象
	int xDown,yDown,xUp,yUp,x,y ;
	String Bname;//按钮名字及图像类型
	//Color red = new Color(255,0,0);
	//Color black = new Color(0,0,0);
	
	int count=0;//记录图像个数
    Color color;;//记录颜色
	Shape[] data=new Shape[100000];//创建一个保存图像的数组
	
	@Override
	//鼠标监听器的方法
    public void mouseClicked(MouseEvent e) {
    
    
    	System.out.println("鼠标点击");
    }

    public void mousePressed(MouseEvent e) {
    
    
    	//获取按下时的坐标
    	 xDown=e.getX();
    	 yDown=e.getY();
    	 
    	System.out.println("鼠标按下");
    }

    public void mouseReleased(MouseEvent e) {
    
    
    	//获取释放时坐标
    	 xUp=e.getX();
    	 yUp=e.getY();
    	 
    	 //根据按钮画指定图形
       	 if(Bname.equals("直线")) {
    
    
       		System.out.println(Bname);
       		g.drawLine(xDown, yDown, xUp, yUp);
            NewShape(xDown,yDown,xUp,yUp,"直线",color);
       	} 
       	else if(Bname.equals("矩形")) {
    
    
       		System.out.println(Bname);
       		if(xDown<xUp) {
    
    
       		g.drawRect(xDown,yDown, xUp-xDown,yUp-yDown);
       		//NewShape(xDown,yDown,xDown,yDown,"矩形",color);//重绘失败  无法显示矩形???
       		}else {
    
    
       			g.drawRect(xDown-(xDown-xUp),yDown-(yDown-yUp), Math.abs(xUp-xDown), Math.abs(yUp-yDown));
       			//NewShape(xDown-(xDown-xUp),yDown-(yDown-yUp),xDown-(xDown-xUp),yDown-(yDown-yUp),"矩形",color);//重绘失败  无法显示矩形???
       		}
       		NewShape(xDown,yDown,xUp,yUp,"矩形",color);//NewShape记录的是什么点的坐标???
       	}else if(Bname.equals("立体图")) {
    
    
       		int i;
       		for(i=0;i<100;i++){
    
    
    			g.setColor(new Color(i*2, 100+i, i*2+50));
    			g.fillOval(xDown+i/3, yDown+i/3, 100-i, 100-i);
    		}
       		NewShape(xDown, yDown, xDown,yDown,"立体图",color);//画完整个图再保存 NewShape记录的是什么点的坐标???    为什么记录xDown、yDown???
       		//NewShape(xDown+i/3, yDown+i/3,xDown+i/3, yDown+i/3,"立体图",color);  i的值改变了  于是保存后重绘时图形会移动
       	}else if(Bname.equals("分形图")) {
    
    
       		//System.out.println(Bname);
       		double a=-1.4,b=1.6,c=1.0,d=0.7;
       		double x=0.0,y=0.0;
       		double temx=0.0,temy=0.0;
       		int drawx=0,drawy=0;
       		for(int i=0;i<1000;i++) {
    
    
       			//System.out.println(i);
       			temx = Math.sin(a*y)+c*Math.cos(a*x);
       			temy = Math.sin(b*x)+d*Math.cos(b*y);
       			x=temx;
       			y=temy;
       			drawx = (int)(temx*50+xDown);
       			drawy = (int)(temy*50+yDown);
       			//g.setColor(new Color(0,0,i/100));
       			g.drawLine(drawx, drawy, drawx, drawy);
       			//System.out.println(drawx+"    "+drawy);
       		}
       		NewShape(xDown, yDown, xUp, yUp,"分形图",color);
       		//NewShape(drawx,drawy,drawx,drawy,"分形图",color);// 为什么图形重绘后会移动???    记录的是什么点的坐标
       	}else if(Bname.equals("三点分形")) {
    
       //平面随机生成三个点  再随机生成点xp  掷色子选中三点之一
       		Random random = new Random();   
       		int x1 = (int)(Math.random()*500);//生成随机坐标x1
       		int y1 = (int)(Math.random()*500);//生成随机坐标y1
       		int x2 = (int)(Math.random()*500);//生成随机坐标x2
       		int y2 = (int)(Math.random()*500);//生成随机坐标y2
       		int x3 = (int)(Math.random()*500);//生成随机坐标x3
       		int y3 = (int)(Math.random()*500);//生成随机坐标y3
       		int xp = (int)(Math.random()*500);//生成随机点xp
       		int yp = (int)(Math.random()*500);//生成随机点yp
       		for(int i=0;i<1000;i++) {
    
    
       			int k=random.nextInt(3);
       			if(k==0) {
    
    
       				g.drawLine((x1+xp)/2,(y1+yp)/2,(x1+xp)/2,(y1+yp)/2);
       				NewShape((x1+xp)/2,(y1+yp)/2,(x1+xp)/2,(y1+yp)/2,"三点分形",color);//不断在画???
       				System.out.println((x1+xp)/2+"   "+(y1+yp)/2);
       				xp=(x1+xp)/2;
       				yp=(y1+yp)/2;
       			}else if(k==1) {
    
    
       				g.drawLine((x2+xp)/2,(y2+yp)/2,(x2+xp)/2,(y2+yp)/2);
       				NewShape((x2+xp)/2,(y2+yp)/2,(x2+xp)/2,(y2+yp)/2,"三点分形",color);//不断在画???
       				System.out.println((x2+xp)/2+"   "+(y2+yp)/2);
       				xp=(x2+xp)/2;
       				yp=(y2+yp)/2;
       			}else if(k==2) {
    
    
       				g.drawLine((x3+xp)/2,(y3+yp)/2,(x3+xp)/2,(y3+yp)/2);
       				NewShape((x3+xp)/2,(y3+yp)/2,(x3+xp)/2,(y3+yp)/2,"三点分形",color);//不断在画???
       				System.out.println((x3+xp)/2+"   "+(y3+yp)/2);
       				xp=(x3+xp)/2;
       				yp=(y3+yp)/2;
       			}
       		}    		
       	}
       	else if (Bname.equals("概率画图")) {
    
    //画图分为5种情况   每种情况概率相等   每次仅画其中的一种情况
       		double a,b,c,d,e1,f;
       		double x=0.0,y=0.0;
       		int drawx=0,drawy=0;
       		Random random = new Random();
       		for(int i=0;i<1000;i++) {
    
    
       		int k=random.nextInt(5);
       		if(k==0) {
    
    
   				a=0.1950;b=-0.4880;c=0.3440;d=0.4430;e1=0.4431;f=0.2452;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				drawx = (int)(temx*500+xDown);
   				drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				x=temx;
   				y=temy;
   				System.out.println(drawx+"  "+drawy);
   				
       		}else if(k==1) {
    
    
   				a=0.4620;b=0.4140;c=-0.2520;d=0.3610;e1=0.2511;f=0.5692;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				drawx = (int)(temx*500+xDown);
   				drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==2) {
    
    
   				a=-0.6370;b=0.0000;c=0.0000;d=0.5010;e1=0.8562;f=0.2512;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				drawx = (int)(temx*500+xDown);
   				drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==3) {
    
    
   				a=-0.0350;b=0.0700;c=-0.4690;d=0.0220;e1=0.4884;f=0.5069;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				drawx = (int)(temx*500+xDown);
   				drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
       		}else if(k==4) {
    
    
   				a=-0.0580;b=-0.0700;c=0.4530;d=-0.1110;e1=0.5976;f=0.0969;
   				double temx=a*x+b*y+e1;
   				double temy=c*x+d*y+f;
   				drawx = (int)(temx*500+xDown);
   				drawy = (int)(temy*500+yDown);
   				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
   				System.out.println(drawx+"  "+drawy);
   				x=temx;
   				y=temy;
   			}
       		}
       		//NewShape(drawx, -drawy+800, drawx, -drawy+800,"概率画图",color);//为什么图像重绘后移动了????
       		NewShape(xDown,yDown,xUp,yUp,"概率画图",color);//???为什么记录的是xDown yDown xUp yUp
       		}
       	else if(Bname.equals("递归直线")) {
    
    
        //MyDrawLine(6,xDown,yDown,xDown+600,yDown);//三等分画线,6为递归结束条件 
        RecurShape shapeRecur = new RecurShape(xDown,yDown,xUp+600,yUp,Bname,color,6);
        shapeRecur.show(g);
        //shapeRecur.MyDrawLine(xDown,yDown,xDown+600,yDown,g,6);
		data[count]=shapeRecur;
		count++;
       	}
       	else if(Bname.equals("九宫格")) {
    
    
       		System.out.println(color);
       		System.out.println();
       	SudokuShape shapeSudoku = new SudokuShape(xDown,yDown,300,300,Bname,color);
       	//shapeSudoku.MyDrawRec(xDown, yDown, 300, 300, g);
       	shapeSudoku.show(g);
       	data[count]=shapeSudoku;
		count++;
       	}
       	else if(Bname.equals("立体九宫格")) {
    
    
       	DimenSudokuShape shapeSudokuDimen = new DimenSudokuShape(xDown,yDown,300,300,100,100,Bname,color);
       	//shapeSudokuDimen.MyDrawDimenRec(xDown,yDown,300,300,100,100,g);
       	shapeSudokuDimen.show(g);//绘制图形
       	data[count]=shapeSudokuDimen;//保存图形
		count++;
       	}
       	 
       	 
       	
       	System.out.println("鼠标释放");
       	}
       	 
    	


    public void mouseEntered(MouseEvent e) {
    
    
    }

    public void mouseExited(MouseEvent e) {
    
    
    }
    
    
    @Override
    //鼠标移动监听器的方法
    //鼠标拖拽
    public void mouseDragged(MouseEvent e) {
    
    
    	if(Bname.equals("曲线")) {
    
    
        	x=e.getX();
        	y=e.getY();
            g.drawLine(xDown,yDown,x,y);
            NewShape(xDown, yDown, x, y,"曲线",color);
            xDown=x;
            yDown=y;
    	}
    	

    }
    //鼠标移动
    public void mouseMoved(MouseEvent e) {
    
    

    }
    
    
    @Override
    //动作监听器的方法  按下之后要执行的动作
    public void actionPerformed(ActionEvent e) {
    
    
    	 //获取当前事件源内容
    	 if(e.getActionCommand().equals("")) {
    
    //得到按钮上的字符串,根据有无字符串判断改变颜色或者获得获得字符串名字
    		 JButton jbu = (JButton)e.getSource();//获取当前事件源对象,是个按钮类型的对象jbu
    	     color = jbu.getBackground();//得到按钮背景颜色
    		 g.setColor(color);//改变画笔颜色,将按钮背景颜色设置为画笔颜色
    	 }else {
    
    
    		 Bname = e.getActionCommand();//不是颜色按钮则获得按钮上的字符串
    	 }
    }
       
public void NewShape(int x1,int y1,int x2,int y2,String type,Color color) {
    
    //保存图像有关信息
	Shape s = new Shape();//存储的是四个点???分别对应哪四个点
	s.x1=x1;
	s.y1=y1;
	s.x2=x2;
	s.y2=y2;
	s.type=Bname;
	s.color=g.getColor();
	data[count]=s;
	count++;
}
} 

package com.yzd1209.DrawRepaint;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;

public class Shape{
    
    
//将所有与图形相关的信息保存再Repaint类中  包括属性和方法
int x1,y1,x2,y2;
String type;
Color color;
Graphics g;
public Shape() {
    
    //无参构造方法   方便子类重写
	
}

public Shape(int x1,int y1,int x2,int y2,String type,Color color) {
    
    //有参构造方法
	         //       xDown  yDown  xUp    yUp   Shape中x1与DrawListener中坐标的关系???
	this.x1=x1;//?????
	this.y1=y1;
	this.x2=x2;
	this.y2=y2;
	this.type=type;
	
	this.color=color;
}

public void show(Graphics g) {
    
    
	g.setColor(color);
	// TODO Auto-generated method stub
    if("直线".equals(type)) {
    
    
    	g.drawLine(x1,y1,x2,y2);
	}else if("矩形".equals(type)) {
    
    
		if(x1<x2) {
    
    
       		g.drawRect(x1,y1, x2-x1,y2-y1);
       		}else {
    
    
       			g.drawRect(x1-(x1-x2),y1-(y1-y2), Math.abs(x2-x1), Math.abs(y2-y1));
       		}
	}else if("立体图".equals(type)) {
    
    
		for(int i=0;i<100;i++) {
    
    
			g.setColor(new Color(i*2, 100+i, i*2+50));
			g.fillOval(x1+i/3, y1+i/3, 100-i, 100-i);
		}
	}else if("分形图".equals(type)) {
    
    
   		double a=-1.4,b=1.6,c=1.0,d=0.7;
   		double x=0.0,y=0.0;
   		for(int i=0;i<1000;i++) {
    
    
   			//System.out.println(i);
   			double temx = Math.sin(a*y)+c*Math.cos(a*x);
   			double temy = Math.sin(b*x)+d*Math.cos(b*y);
   			x=temx;
   			y=temy;
   			int drawx = (int)(temx*50+x1);
   			int drawy = (int)(temy*50+y1);
   			//g.setColor(new Color(0,0,i/100));
   			g.drawLine(drawx, drawy, drawx, drawy);
   		}
	}else if("概率画图".equals(type)) {
    
    
   		double a,b,c,d,e1,f;
   		double x=0.0,y=0.0;
   		Random random = new Random();
   		for(int i=0;i<1000;i++) {
    
    
   		int k=random.nextInt(5);
   		if(k==0) {
    
    
				a=0.1950;b=-0.4880;c=0.3440;d=0.4430;e1=0.4431;f=0.2452;
				double temx=a*x+b*y+e1;
				double temy=c*x+d*y+f;
				int drawx = (int)(temx*500+x1);
				int drawy = (int)(temy*500+y1);
				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
				x=temx;
				y=temy;
				//System.out.println(drawx+"  "+drawy);
				
   		}else if(k==1) {
    
    
				a=0.4620;b=0.4140;c=-0.2520;d=0.3610;e1=0.2511;f=0.5692;
				double temx=a*x+b*y+e1;
				double temy=c*x+d*y+f;
				int drawx = (int)(temx*500+x1);
				int drawy = (int)(temy*500+y1);
				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
				//System.out.println(drawx+"  "+drawy);
				x=temx;
				y=temy;
   		}else if(k==2) {
    
    
				a=-0.6370;b=0.0000;c=0.0000;d=0.5010;e1=0.8562;f=0.2512;
				double temx=a*x+b*y+e1;
				double temy=c*x+d*y+f;
				int drawx = (int)(temx*500+x1);
				int drawy = (int)(temy*500+y1);
				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
				//System.out.println(drawx+"  "+drawy);
				x=temx;
				y=temy;
   		}else if(k==3) {
    
    
				a=-0.0350;b=0.0700;c=-0.4690;d=0.0220;e1=0.4884;f=0.5069;
				double temx=a*x+b*y+e1;
				double temy=c*x+d*y+f;
				int drawx = (int)(temx*500+x1);
				int drawy = (int)(temy*500+y1);
				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
				//System.out.println(drawx+"  "+drawy);
				x=temx;
				y=temy;
   		}else if(k==4) {
    
    
				a=-0.0580;b=-0.0700;c=0.4530;d=-0.1110;e1=0.5976;f=0.0969;
				double temx=a*x+b*y+e1;
				double temy=c*x+d*y+f;
				int drawx = (int)(temx*500+x1);
				int drawy = (int)(temy*500+y1);
				g.drawLine(drawx, -drawy+800, drawx, -drawy+800);
				//System.out.println(drawx+"  "+drawy);
				x=temx;
				y=temy;
			}
   		}
	}else if("曲线".equals(type)) {
    
    
		g.drawLine(x1, y1, x2, y2);
	}else if("三点分形".equals(type)) {
    
    
		g.drawLine(x1, y1, x2, y2);
	}

}


}


package com.yzd1209.DrawRepaint;

import java.awt.Graphics;

import javax.swing.JFrame;

public class DrawFrame extends JFrame{
    
    //重绘
	Shape [] data;//图像对象的数组    包含6个类型的数据x1 y1 x2 y2 type color
	
    DrawListener dlistener=null;//声明一个DrawListener类型的对象   默认初始化为null    ???
    public void paint(Graphics g) {
    
    //重写paint方法
         super.paint(g);
         //调用父类的paint方法,绘制组件   自动绘制按钮等组件    
         //画图的paint方法正在重写(因为当窗体移出桌面时不会自动调用,要实现和组件同时出现就要在调用paint方法时一起自动调用)
         data=dlistener.data;//将dlistener.data(即定义的100000大小的数组)传给data  ????
         for(int i=0;i<data.length;i++) {
    
    //遍历数组
        	  if(data[i]!=null) {
    
    
        		  data[i].show(g);//调用每种图形对应的方法画图,这样就能在展示按钮的同时展示图像
        	  } 
        	  else {
    
    
        		  break;
        	  }
         }
         System.out.println("paint");
    }
}

package com.yzd1209.DrawRepaint;

import java.awt.Color;
import java.awt.Graphics;

//递归直线重绘方法
public class RecurShape extends Shape{
    
    
	int n;//递归直线递归次数
	public RecurShape(int x1,int y1,int x2,int y2,String type,Color color,int n) {
    
    
	    super(x1,y1,x2,y2,type,color);
		this.n=n;
	}
	
	public void show(Graphics g) {
    
    
		if (type.equals("递归直线")) {
    
    
			g.setColor(color);
			MyDrawLine(x1,y1,x2,y2,g,6);
		}
	}
	public void MyDrawLine(int x1,int y1,int x2,int y2,Graphics g,int n) {
    
    //自定义方法递归画直线  n为递归结束条件
    	if(n==0) {
    
    //递归终止条件
    		return;//终止处理
    	}
    	g.drawLine(x1, y1, x2, y2);//初始线	
    	int xL1=x1;int yL1=y1+40;int xL2=x1+(x2-x1)/3;int yL2=y1+40;//计算左三等分线坐标
    	MyDrawLine(xL1,yL1,xL2,yL2,g,n-1);//递归调用,每调用一次n-1
    	//System.out.println(n);
    	int xR1=x2-(x2-x1)/3;int yR1=y2+40;int xR2=x2;int yR2=y2+40;//计算右三等分线坐标
    	MyDrawLine(xR1,yR1,xR2,yR2,g,n-1);//递归调用,每调用一次n-1
    	//System.out.println(n);
    }
  
}

package com.yzd1209.DrawRepaint;

import java.awt.Color;
import java.awt.Graphics;

public class SudokuShape extends Shape{
    
    
	//重绘平面九宫格
	int x,y,w,h,dx,dy;
	String type;
	Color color;
	public SudokuShape (int x,int y,int w,int h,String type,Color color) {
    
    
		this.x=x;
		this.y=y;
		this.w=w;
		this.h=h;
		this.type=type;
		this.color=color;
	}
	public void show(Graphics g) {
    
    
		if(type.equals("九宫格")) {
    
    
			//color=g.getColor();
			g.setColor(color);
			MyDrawRec(x,y,300,300,g);
		}
			
	}
	
    public void MyDrawRec(int x,int y,int w,int h,Graphics g) {
    
    //自定义方法画平面九宫格    x、y整个图形起点坐标   w整个图形宽   h整个图形高
    	if(w<1) {
    
    
    		return;//根据所画的矩形宽判断画图是否结束
    	}
    	    //g.setColor(color);
    		g.fillRect(x+w/3, y+h/3, w/3, h/3);//画矩形方法         先画中间的矩形
        	MyDrawRec(x,y,w/3,h/3,g);//从左-》右  从上-》下依次递归调用自己画其他八个矩形    第一行
        	MyDrawRec(x+w/3,y,w/3,h/3,g);
        	MyDrawRec(x+2*w/3,y,w/3,h/3,g);
        	MyDrawRec(x,y+h/3,w/3,h/3,g);//第二行
        	MyDrawRec(x+2*w/3,y+h/3,w/3,h/3,g);
        	MyDrawRec(x,y+2*h/3,w/3,h/3,g);//第三行
        	MyDrawRec(x+w/3,y+2*h/3,w/3,h/3,g);
        	MyDrawRec(x+2*w/3,y+2*h/3,w/3,h/3,g);
    }
	
}

package com.yzd1209.DrawRepaint;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;

public class DimenSudokuShape extends Shape{
    
    
	int x,y,w,h,dx,dy;
	String type;
	Color color;
	public DimenSudokuShape(int x,int y,int w,int h,int dx,int dy,String type,Color color) {
    
    
		this.x=x;
		this.y=y;
		this.w=w;
		this.h=h;
		this.dx=dx;
		this.dy=dy;
		this.type=type;
		this.color=color;
	}
	
	public void show(Graphics g) {
    
    
		if(type.equals("立体九宫格")) {
    
    
			MyDrawDimenRec(x,y,300,300,100,100,g);
		}
	}
	
	public void MyDrawDimenRec(int x,int y,int w,int h,int dx,int dy,Graphics g) {
    
    
    	//自定义方法画立体九宫格    x、y整个图形起点P坐标   w整个图形宽   h整个图形高     dx为视觉立体图宽左端点x轴差    dy为视觉立体图宽左端点y轴差
    	if(w<10) {
    
       //以正方体宽为递归结束条件
    		return;
    	}
    	//九条线连成立体图的效果
    	g.drawLine(x, y, x+w, y);
    	g.drawLine(x, y, x, y+h);
    	g.drawLine(x, y+h, x+w, y+h);
    	g.drawLine(x+w, y, x+w, y+h);
    	g.drawLine(x+w, y+h, x+dx+w, y+h-dy);
    	g.drawLine(x+dx+w, y-dy+h, x+dx+w, y-dy);
    	g.drawLine(x+w, y, x+dx+w, y-dy);
    	g.drawLine(x+dx+w, y-dy, x+dx, y-dy);
    	g.drawLine(x, y, x+dx, y-dy);
    	
    	//给视觉看到的三个面刷上颜色   方便看出效果
    	//填充第一个面颜色    正面
    	Polygon pon1=new Polygon();
    	pon1.addPoint(x,y);//四个点从左上角开始逆时针组成正方体
    	pon1.addPoint(x+w,y);
    	pon1.addPoint(x+w,y+h);
    	pon1.addPoint(x,y+h);
    	g.setColor(new Color(0,150,0));
    	g.fillPolygon(pon1);
    	//填充第二个面颜色    顶面
    	Polygon pon2=new Polygon();
    	pon2.addPoint(x,y);
    	pon2.addPoint(x+w,y);
    	pon2.addPoint(x+dx+w,y-dy);
    	pon2.addPoint(x+dx,y-dy);
    	g.setColor(new Color(150,0,0));
    	g.fillPolygon(pon2);
    	//填充第三个面    侧面
    	Polygon pon3=new Polygon();
    	pon3.addPoint(x+w,y);
    	pon3.addPoint(x+w,y+h);
        pon3.addPoint(x+dx+w,y-dy+h);
    	pon3.addPoint(x+dx+w,y-dy);
    	g.setColor(new Color(0,0,150));
    	g.fillPolygon(pon3);
    	
    	//从下——>上   从左——>右    从后——>前   递归画出内部的20个小正方体     只需给出正面坐上角点的坐标以及缩小的dx、dy    依次调用自己就可以实现
        //第一层的立方体8个   只需计算P点坐标,w、h、dx、dy均为原来的1/3
    	MyDrawDimenRec(x+2*dx/3,y+2*h/3-2*dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+w/3+2*dx/3,y+2*h/3-2*dy/3,w/3,h/3,dx/3,dy/3,g);                                                                                                                                                                                                                                                             
    	MyDrawDimenRec(x+2*w/3+2*dx/3,y+2*h/3-2*dy/3,w/3,h/3,dx/3,dy/3,g);//
    	MyDrawDimenRec(x+dx/3,y+2*h/3-dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3+dx/3,y+2*h/3-dy/3,w/3,h/3,dx/3,dy/3,g);//
    	MyDrawDimenRec(x,y+2*h/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+w/3,y+2*h/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3,y+2*h/3,w/3,h/3,dx/3,dy/3,g);//
     	//第二层立方体4个
    	MyDrawDimenRec(x+2*dx/3,y+h/3-2*dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3+2*dx/3,y+h/3-2*dy/3,w/3,h/3,dx/3,dy/3,g);//
    	MyDrawDimenRec(x,y+h/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3,y+h/3,w/3,h/3,dx/3,dy/3,g);
    	//第三层立方体8个
    	MyDrawDimenRec(x+2*dx/3,y-2*dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+w/3+2*dx/3,y-2*dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3+2*dx/3,y-2*dy/3,w/3,h/3,dx/3,dy/3,g);//
    	MyDrawDimenRec(x+dx/3,y-dy/3,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3+dx/3,y-dy/3,w/3,h/3,dx/3,dy/3,g);//
    	MyDrawDimenRec(x,y,w/3,h/3,dx/3,dy/3,g);                                                                                                                                             
    	MyDrawDimenRec(x+w/3,y,w/3,h/3,dx/3,dy/3,g);
    	MyDrawDimenRec(x+2*w/3,y,w/3,h/3,dx/3,dy/3,g);//

    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43722843/article/details/111052694