用户坐标视图坐标Javaawt坐标概念的建立和应用.docx
- 文档编号:10657073
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:26
- 大小:37.45KB
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx
《用户坐标视图坐标Javaawt坐标概念的建立和应用.docx》由会员分享,可在线阅读,更多相关《用户坐标视图坐标Javaawt坐标概念的建立和应用.docx(26页珍藏版)》请在冰豆网上搜索。
用户坐标视图坐标Javaawt坐标概念的建立和应用
实验1实验报告格式
《计算机图形学》实验1实验报告
实验题目:
用户坐标、视图坐标、Javaawt坐标概念的建立和应用
实验内容:
掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。
编写自己的算法函数,并形成Java语言程序包。
编写程序调用验证之。
参考程序:
有两个示范程序MyCanvas.java和MyLineDrawApplet.java
基本概念:
用户坐标:
是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。
视图坐标:
是设备相关的坐标,随目标渲染设备不同而不同。
Java awt坐标:
使用java.awt时的坐标。
填充:
以已知的某一条线为基准,向周围区域扩展像素,然后对这些像素所在的位置进行着色。
将用户坐标转换为视图坐标实际上是将用户自己设计的逻辑坐标转换为设备相关的坐标,将视图坐标转化为AWT坐标就是将视图坐标按照显示窗口的大小进行缩放。
算法设计:
功能:
用户可根据自己输入的用户坐标,进行视图坐标与awt坐标之间的转换,反向的转换原理与正向相同。
此外,该程序还可以进行图形的绘制和填充,如矩形,椭圆等图形。
算法1:
用户坐标向视图坐标的转换
设userMinx、userMaxx分别为用户坐标系x轴的最小值与最大值,userMiny、userMaxy分别为用户坐标系y轴的最小值与最大值;viewMinx、viewMaxx分别为视图坐标系x轴的最小值与最大值,viewMiny、viewMaxy分别为视图坐标系y轴的最小值与最大值。
若令(userX,userY)为要转换的用户坐标,(viewX,viewY)为转换后的视图坐标。
则它们之间的转换关系为:
viewX=viewMinx+(userX-userMinx)/(userMaxx-userMinx)*(viewMaxx-viewMinx);
viewY=viewMiny+(userY-userMiny)/(userMaxy-userMiny)*(viewMaxy-viewMiny);
算法1实现如下:
publicdoubleviewX(doubleuserX){//x坐标的转换
doubles=(userX-userMinx)/(userMaxx-userMinx);
doublet=viewMinx+s*(viewMaxx-viewMinx);//坐标的平移及压缩
returnt;
}
publicdoubleviewY(doubleuserY){//y坐标的转换
doubles=(y-userMiny)/(userMaxy-userMiny);
doublet=viewMiny+s*(viewMaxy-viewMiny);//坐标的平移及压缩
returnt;
}
算法2:
视图坐标向awt坐标的转换
若令(viewX,viewY)为视图坐标,(x,y)为awt坐标,width、height分别为窗口的宽度和高度,则它们之间的转换关系为:
X=viewX*width;
Y=viewY*height;
算法2实现如下:
//将视图坐标系的点转换到JavaAWT坐标
publicintgetIntX(doubleviewX){
return(int)(windowWidth*viewX);//注意视图坐标0-1之间
}
publicintgetIntY(doubleviewY){
return(int)(windowHeight*(1-viewY));//Y轴方向相反
}
算法3:
绘制矩形
首先将传入的用户坐标转换为awt坐标,通过对传入的坐标比较,找出矩形左上角坐标(ix0,iy0),并求出矩形的宽度width和高度height,利用Graphics类的方法drawRect(ix0,iy0,width,height)可画出矩形。
算法3实现如下:
publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){
//从用户的点坐标转换到JavaAWT坐标
intix1=getX(x1);intiy1=getY(y1);
intix2=getX(x2);intiy2=getY(y2);
intix0=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 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=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 iy1: 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=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 iy1: 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=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 iy1: 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=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 iy1: 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=(ix1 ix1: ix2;//矩形左上角坐标 intiy0=(iy1 iy1: iy2; intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素 intheight=Math.abs((iy1-iy2))+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 坐标 视图 Javaawt 概念 建立 应用