利用对鼠标事件的监听和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球。我还给鼠标加了一个监听,我可以根据鼠标点击的位置来改变光照的位置。