iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;//矩形高度
graphics.drawRect(ix0,iy0,width,height);
}
代码:
(给出主要的Java程序和注解)
//文件名:
MyCanvas.java
//定义用户的canvas类,实现
//从用户坐标到视图的转换
//视图到JavaAWT坐标的转换
//用户坐标系的二维图形的描画方法,等
//用编译命令javac-d.MyCanvas.java把本文件制作成包MyCanvas
//在调用这个包的程序里加入语句importMyCanvas.MyCanvas;
packageshiyan1;//制作的包名,这里包名和类名同
importjava.io.*;
importjava.applet.Applet;
importjava.awt.*;
importjava.awt.image.*;
//定义canvas类
publicclassMyCanvasextendsComponent{
publicstaticvoidmain(String[]args){
Appletm=newApplet();
m.setSize(256,256);
MyCanvasmy=newMyCanvas(m);
my.setWindow(-1,1,-1,1);//设定用户坐标系范围
my.createViewport
(2);
my.setViewport(0,1,0,1);
System.out.println("用户坐标视图坐标awt坐标");
System.out.print(0.3+"");
doublex=my.viewX(0.3);
System.out.print(x+"");
intxx=my.getIntX(x);
System.out.println(xx);
}
//用户坐标系范围缺省值([-1,1],[-1,1])
protecteddoubleuserMinx=-1;//用户坐标系X轴的最小值
protecteddoubleuserMaxx=1;//用户坐标系X轴的最大值
protecteddoubleuserMiny=-1;//用户坐标系Y轴的最小值
protecteddoubleuserMaxy=1;//用户坐标系Y轴的最大值
//视图的坐标范围缺省值([0,1],[0,1])
protecteddouble[]viewMinx;//各视图X轴最小值的数组
protecteddouble[]viewMaxx;//各视图X轴最大值的数组
protecteddouble[]viewMiny;//各视图Y轴最小值的数组
protecteddouble[]viewMaxy;//各视图Y轴最大值的数组
finalstaticintDefaultViewportMax=256;//缺省的视图数
protectedintviewportMax=DefaultViewportMax;//最大视图数
protectedintviewportNum=0;//当前视图数
protectedintcurrentViewport=0;//当前视图的索引号
//窗口大小
finalstaticintDefaultWindowSize=256;//缺省的窗口大小
protectedintwindowWidth=DefaultWindowSize;//窗口宽度
protectedintwindowHeight=DefaultWindowSize;//窗口宽度
//定义JavaAWT的Graphics和Component
protectedGraphicsgraphics;//MyCanvas的Graphics数据类
protectedComponentcomponent;//MyCanvas的component数据类
protectedColorcurrentFrontColor=Color.white;//当前前景颜色
protectedColorcurrentBackColor=Color.white;//当前背景色
//构造方法
//缺省的构造方法中viewportMax=256
publicMyCanvas(Componenta){
component=a;//设定MyCanvas类所用的Component
graphics=a.getGraphics();//设定MyCanvas类所用的graphics
windowWidth=a.getSize().width;//窗口宽度
windowHeight=a.getSize().height;//窗口高度
createViewport(DefaultViewportMax);//创建视图
}
//创建视图
privatevoidcreateViewport(intmax){
currentViewport=0;//设定当前视图索引号
viewportMax=max;//设定视图数的最大值
viewMinx=newdouble[viewportMax];//存放各视图X轴最小值
viewMaxx=newdouble[viewportMax];//存放各视图X轴最大值
viewMiny=newdouble[viewportMax];//存放各视图y轴最小值
viewMaxy=newdouble[viewportMax];//存放各视图y轴最大值
viewMinx[currentViewport]=0.0;//设定当前视图的坐标轴范围
viewMiny[currentViewport]=0.0;
viewMaxx[currentViewport]=1.0;
viewMaxy[currentViewport]=1.0;
viewportNum=1;//当前视图数
}
//设定用户坐标系范围
publicvoidsetWindow(doublex1,doublex2,doubley1,doubley2){
userMinx=x1;//设定窗口(用户坐标系)X轴的最小值
userMaxx=x2;//设定窗口(用户坐标系)X轴的最大值
userMiny=y1;//设定窗口(用户坐标系)y轴的最小值
userMaxy=y2;//设定窗口(用户坐标系)y轴的最大值
}
//设定视图
publicvoidsetViewport(doublex1,doublex2,doubley1,doubley2){
currentViewport=viewportNum;//设定新的当前视图索引号
viewportNum++;//当前视图数加1
viewMinx[currentViewport]=x1;//存放视图的X轴最小值
viewMaxx[currentViewport]=x2;//存放视图的X轴最大值
viewMiny[currentViewport]=y1;//存放视图的y轴最小值
viewMaxy[currentViewport]=y2;//存放视图的y轴最大值
}
//视图复位
publicvoidresetViewport(){
currentViewport=0;//当前视图索引号重归于零
viewMinx[currentViewport]=0.0;//设定当前视图的坐标轴范围
viewMiny[currentViewport]=0.0;
viewMaxx[currentViewport]=1.0;
viewMaxy[currentViewport]=1.0;
viewportNum=1;//当前视图数
}
//将视图坐标系的点转换到JavaAWT坐标
publicintgetIntX(doublex){
return(int)(windowWidth*x);//注意视图坐标0-1之间
}
publicintgetIntY(doubley){
return(int)(windowHeight*(1-y));//Y轴方向相反
}
//将用户坐标的点转换到视图坐标
publicdoubleviewX(doublex){
doubles=(x-userMinx)/(userMaxx-userMinx);
doublet=viewMinx[currentViewport]+s*//坐标的平移及压缩
(viewMaxx[currentViewport]-viewMinx[currentViewport]);
returnt;
}
publicdoubleviewY(doubley){
doubles=(y-userMiny)/(userMaxy-userMiny);
doublet=viewMiny[currentViewport]+s*//坐标的平移及压缩
(viewMaxy[currentViewport]-viewMiny[currentViewport]);
returnt;
}
//将用户坐标的点转换到JavaAWT坐标
publicintgetX(doublex){
doublexx=viewX(x);//先将x转换到视图坐标
intix=getIntX(xx);//将视图坐标转换到JavaAWT坐标
returnix;
}
publicintgetY(doubley){
doubleyy=viewY(y);//先将y转换到视图坐标
intiy=getIntY(yy);//将视图坐标转换到JavaAWT坐标
returniy;
}
//将用户坐标系的宽度、高度值投影到JavaAWT坐标
publicintgetDimensionX(doublew){
doublex=viewMaxx[currentViewport]-viewMinx[currentViewport];
x*=windowWidth*w/(userMaxx-userMinx);//按比例投影,经由视图坐标系
return((int)Math.abs(x));//用户坐标系可能反向
}
publicintgetDimensionY(doubleh){
doubley=viewMaxy[currentViewport]-viewMiny[currentViewport];
y*=windowHeight*h/(userMaxy-userMiny);//按比例投影,经由视图坐标系
return((int)Math.abs(y));//用户坐标系可能反向
}
//有关当前颜色的设定方法:
画笔颜色、前景色、背景色
publicColorgetColor(){
returncurrentFrontColor;//得到当前颜色序号
}
publicvoidsetColor(Colorc){
graphics.setColor(c);//设置图形对象的颜色
currentFrontColor=c;//设定当前颜色序号
}
publicColorgetForeground(){
returncurrentFrontColor;//得到当前前景色序号
}
publicvoidsetForeground(Colorc){
component.setForeground(c);//设置前景色
currentFrontColor=c;//设定当前前景色序号
}
publicColorgetBackground(){
returncurrentBackColor;//得到当前背景色序号
}
publicvoidsetBackground(Colorc){
component.setBackground(c);//设置背景色
currentBackColor=c;//设定当前背景色序号
}
//-----各类图形的描画方法-----------
//直线画法:
两点式参数
publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){
//从用户的点坐标转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
graphics.drawLine(ix1,iy1,ix2,iy2);//这个方法它是怎样画直线的?
}
//矩形画法:
对角式参数
publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){
//从用户的点坐标转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1ix1:
ix2;//矩形左上角坐标
intiy0=(iy1iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;//矩形高度
graphics.drawRect(ix0,iy0,width,height);
}
//矩形填充
publicvoidfillRect(doublex1,doubley1,doublex2,doubley2){
//从用户的点坐标转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1ix1:
ix2;//矩形左上角坐标
intiy0=(iy1iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;//矩形高度
graphics.fillRect(ix0,iy0,width,height);//填充算法如何实现?
}
//矩形区域的清除
publicvoidclearRect(doublex1,doubley1,doublex2,doubley2){
//从用户的点坐标转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1ix1:
ix2;//矩形左上角坐标
intiy0=(iy1iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;//矩形高度
graphics.clearRect(ix0,iy0,width,height);//算法等同填充
}
//圆角矩形画法
publicvoiddrawRoundRect(doublex1,doubley1,doublex2,doubley2,
doublearcW,doublearcH){//圆弧高度、圆弧宽度
//从用户坐标的点转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1ix1:
ix2;//矩形左上角坐标
intiy0=(iy1iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;//矩形高度
intiarcWidth=getDimensionX(arcW);//圆弧宽度投影到JavaAWT坐标
intiarcHeight=getDimensionX(arcH);//圆弧高度投影
graphics.drawRoundRect(ix0,iy0,width,height,iarcWidth,iarcHeight);
}
//圆角矩形填充
publicvoidfillRoundRect(doublex1,doubley1,doublex2,doubley2,
doublearcW,doublearcH){//圆弧高度、圆弧宽度
//从用户坐标的点转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1ix1:
ix2;//矩形左上角坐标
intiy0=(iy1iy1:
iy2;
intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素
intheight=Math.abs((iy1-iy2))+1;