Java有哪些绘图工具 java绘图板_Math

利用对鼠标事件的监听和java自带的绘图接口,我就可以制作出来一个简单地的绘图板。绘图板可以调用各种各样的绘图函数来绘制各种各样图案。我可以绘制正方形,直线,以及自己的照片。

我可以利用鼠标的事件接口来监控鼠标的位置和点击事件,这样我就可以用鼠标在自己想要的地方绘制图案。

public class DrawListener implements MouseListener {
	private int x1, y1, x2, y2,x3,y3,n=0;
	private int panding=1;
	private int[] b=new int[6];
	private int[] a=new int[6];
	public fenxing f=new fenxing();
private Graphics g;

我建立了一个鼠标监听类来监听鼠标的事件。

public void mouseReleased(MouseEvent e) {
		System.out.println("释放");
		// 5.获取释放时的坐标值
		x2 = e.getX();
		y2 = e.getY();
		
		//6.在释放的方法中实现直线的绘制。
		
		System.out.println(panding);
		if(panding==1){
			g.drawLine(x1, y1, x2, y2);
		}
		else if(panding==2){
			g.fill3DRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1), true);
		}
		else if(panding==3){
			g.fillArc(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1), 45 , 90);
		}
		else if(panding==4){
			g.fillOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
		}
		else if(panding==5){
			g.fillRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
		}
		else if(panding==6){
			g.fillRoundRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1), 30, 30);
		}
		else if(panding==7){
			g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
		}
		else if(panding==8){
			g.draw3DRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1), true);
		}
		else if(panding==9){
			g.drawArc(n, y1, Math.abs(x2-x1), Math.abs(y2-y1), 45 , 90);
		}
		else if(panding==0){
			g.drawImage(newf.getImage(), x1, y1, x2, y2, null);
		}
		else if(panding==15){
			f.setG(g);
			f.yuan(x1,y1,100);
		}

我写了一个函数来在鼠标点击之后实现绘图,我根据按钮按下后会改变panding变量的值,来判断该画哪一个图形。并且记录下来鼠标按下和松开的位置。比如画直线,我可以用按下的位置设为直线的起点,松开的位置设为直线的终点。这样就可以按照使用者的想法来绘制直线,同理可以用到画其他的图形上。

我还写了分型图案,可以按照写好的函数分型,画出漂亮的图案。

Java有哪些绘图工具 java绘图板_System_02

public void dd1(){
		double x=0,y=0,x1=0,y1=0;
		double a=-2,b=-2,c=-1.2,d=2;		
		Random rand = new Random();
		int m3;
		m3=rand.nextInt(255);
		for(int n=0;n<1000000;n++){
			x1=Math.sin(a*y)-Math.cos(b*x);
			y1=Math.sin(c*x)-Math.cos(d*y);
			x=x1;
			y=y1;
			int m = (int)((x*200)+500);
			int mm = (int)((y*200)+500);
			int m1=(int)(m/4);
			int m2=(int)(mm/4);
			g.setColor(new Color(m3%255,m1%255,m2%255));
			g.drawLine(m, mm, m, mm);
		}

使用上面的函数,就可以绘制出和图片中医药的团。为了防止绘制出的分型图案只有一个颜色,看起来太单调。我把分型的图案的颜色设置成和位置相关的变量,这样就可以绘制出渐变颜色的分型图案,让图案更加美观漂亮。

Java有哪些绘图工具 java绘图板_Java有哪些绘图工具_03


我还制作了一个栩栩如生的3d球,这个3d球不是简单的视觉欺骗。我写了一个函数,其中有球体的半径和圆心点的坐标。圆上的每个点都是有x y z坐标的,根据x y z坐标就可以算出来这个点和光线的夹角,根据和光线的夹角算出来这个点的亮度。

public void yyuan(double cx1,double cy1,double cz1,double r,double fx,double fy,double fz){

		double x,y,z;      //定义3d圆的的坐标和半径
//		double r=50;
		xyzdian yuanxin= new xyzdian(cx1,cy1,cz1);
		int c;          //输出颜色的深浅
		System.out.println("开始打印3d圆");
		double r2=Math.pow(r,2);
		for(x=-r;x<=r;x++){             //圆的半径从x=0开始一直到等于r;
			System.out.println("x="+x);
			double x2=Math.pow(x,2);
			y=(double)(r2-x2);       //当前x值时y的最大值
			y=(double)(Math.sqrt(y)); 
			System.out.println("y="+y);
			for(double y1=-y;y1<y;y1++){
				
//				System.out.println("y1="+y1);  
				double y2=Math.pow(y1,2);
				z=(int)(r2-x2-y2);      //y从小到大的时z的值
//				System.out.println("z^2="+r2+"-"+x2+"-"+y2);
//				System.out.println(z);
				z=(int)(Math.sqrt(z));     //开方算出z的值
				xyzdian fangxiang=new xyzdian(x,y1,z);//该点的方向向量
				xyzdian guanxian= new xyzdian(fx-cx1,fy-cy1,fz-cz1);//光线的方向
				double k=fangxiang.cos(guanxian);         
				
//				k=(double)z/(double)r;                      //k为反射光线亮的的比值
				k=Math.toDegrees (Math.acos (k));
				if(k<90){
				k=(double)k/(double)90;}
				else if(k>=90){
					k=(double)1;
				}
				k=(double)1-(double)k;
				double n=1.4;       //反射效果
				k=(double)k/(double)n;
				int h=(int)((double)255/(double)n);
				h=255-h;
				c=(int)((double)k*255);               //算出反射的亮度
				c=c+h;
				if(c>249){
					c=249;
				}
				g.setColor(new Color(c,c,c));   
				g.drawLine((int)(x+cx1) ,(int)(y1+cy1),(int)(x+cx1), (int)(y1+cy1));      //按照亮度打印这个点
//				g.drawLine(x+400 ,r+200-y1,x+400, r+200-y1);
//				g.drawLine(400-x ,y1+r+200,400-x, y1+r+200);      //按照亮度打印这个点
//				g.drawLine(400-x ,r+200-y1,400-x, r+200-y1);
				System.out.println("c="+c);
			}
		}
	
	}

这里面计算了对应像素的每一个圆上点的亮度。因为屏幕只能输出二维图案,所以需要把三维的数据变成二维表现出来,我为了简单没有做的特别真实,只是减少了一个坐标,我舍去了z轴坐标,按照每个点在x y上的坐标输出到屏幕上相应的位置,在按照之前算好的亮度输出颜色,这样就能在屏幕上绘制出一个非常真实的3d球。我还给鼠标加了一个监听,我可以根据鼠标点击的位置来改变光照的位置。