初学java制作了一个绘图板

来源:互联网 发布:中国经济数据发布时间 编辑:程序博客网 时间:2024/05/17 23:19

利用对鼠标事件的监听和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变量的值,来判断该画哪一个图形。并且记录下来鼠标按下和松开的位置。比如画直线,我可以用按下的位置设为直线的起点,松开的位置设为直线的终点。这样就可以按照使用者的想法来绘制直线,同理可以用到画其他的图形上。

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

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);}
使用上面的函数,就可以绘制出和图片中医药的团。为了防止绘制出的分型图案只有一个颜色,看起来太单调。我把分型的图案的颜色设置成和位置相关的变量,这样就可以绘制出渐变颜色的分型图案,让图案更加美观漂亮。
我还制作了一个栩栩如生的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球。我还给鼠标加了一个监听,我可以根据鼠标点击的位置来改变光照的位置。

0 0