版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《计算机图形学》实验1实验报告实验题目:用户坐标、视图坐标、Javaawt坐标概念的建立和应用实验内容:掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。编写自己的算法函数,并形成Java语言程序包。编写程序调用验证之。参考程序:有两个示范程序MyCanvas.java和MyLineDrawApplet.java基本概念:用户坐标:是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。
视图坐标:是设备相关的坐标,随目标渲染设备不同而不同。
Java
awt坐标:使用java.awt时的坐标,即窗口显示图像时的边界坐标。。
填充:这个过程可以抽象的理解为以已知的线为中心,向周围扩展像素,然后对这些像素所在的方块进行着色。算法设计:功能:用户可根据自己输入的用户坐标,进行视图坐标与javaawt坐标之间的转换,反向的转换原理与正向相同。此外,该程序还可以进行一些基本图形的绘制和颜色的填充,如矩形,椭圆等图形。算法1:用户坐标向视图坐标的转换设userMinx、userMaxx分别为用户坐标系x轴的最小值与最大值,userMiny、userMaxy分别为用户坐标系y轴的最小值与最大值;viewMinx、viewMaxx分别为视图坐标系x轴的最小值与最大值,viewMiny、viewMaxy分别为视图坐标系y轴的最小值与最大值。通过坐标的压缩及平移实现坐标的转换。转换关系如下:viewX=viewMinx+(userX-userMinx)/(userMaxx-userMinx)*(viewMaxx-viewMinx)viewY=viewMiny+(userY-userMiny)/(userMaxy-userMiny)*(viewMaxy-viewMiny)算法实现://将用户坐标的点转换到视图坐标 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; }算法2:视图坐标向javaawt坐标的转换若令(viewX,viewY)为视图坐标,(x,y)为awt坐标,width、height分别为窗口的宽度和高度,则它们之间的转换关系为:X=viewX*widthY=viewY*height算法实现://将视图坐标系的点转换到JavaAWT坐标 publicintgetIntX(doublex){ return(int)(windowWidth*x); //注意视图坐标0-1之间 } publicintgetIntY(doubley){ return(int)(windowHeight*(1-y)); //Y轴方向相反 }算法3:椭圆的绘制首先将从用户坐标获得的圆心坐标转换到javaawt坐标,将X、Y轴坐标分别投影在AWT坐标上,获得椭圆外切矩形的左上角X、Y轴坐标,即可绘制出椭圆。算法实现://椭圆的画法(圆心坐标和两个半径) publicvoiddrawOval(doublex,doubley,doublexr,doubleyr){ //圆心从用户坐标转换到JavaAWT坐标 intix=getX(x); intiy=getY(y); intixr=getDimensionX(xr); //x轴半径投影到JavaAWT坐标 intiyr=getDimensionX(yr); //y轴半径投影 intx0=ix-ixr; //椭圆外切矩形的左上角x坐标 inty0=iy-iyr; //椭圆外切矩形的左上角y坐标 graphics.drawOval(x0,y0,2*ixr,2*iyr); } 代码://文件名:MyCanvas.java//定义用户的canvas类,实现// 从用户坐标到视图的转换// 视图到JavaAWT坐标的转换// 用户坐标系的二维图形的描画方法,等//用编译命令javac-d.MyCanvas.java把本文件制作成包MyCanvas//在调用这个包的程序里加入语句importMyCanvas.MyCanvas;package MyCanvas; //制作的包名,这里包名和类名同importjava.io.*;importjava.awt.*;importjava.awt.image.*;//定义canvas类publicclassMyCanvasextendsComponent{ //用户坐标系范围缺省值([-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<ix2)?ix1:ix2; //矩形左上角坐标 intiy0=(iy1<iy2)?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<ix2)?ix1:ix2; //矩形左上角坐标 intiy0=(iy1<iy2)?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<ix2)?ix1:ix2; //矩形左上角坐标 intiy0=(iy1<iy2)?iy1:iy2; intwidth=Math.abs((ix1-ix2))+1; //矩形宽度,单位像素 intheight=Math.abs((iy1-iy2))+1; //矩形高度 graphics.clearRect(ix0,iy0,width,height); //算法等同填充 }//椭圆的画法(圆心坐标和两个半径) publicvoiddrawOval(doublex,doubl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 腐蚀性化学品买卖
- 2024【农田租赁合同范本】租赁农田合同书
- 【语文课件】洲际导弹自述
- 公共设施运营计划管理考核试卷
- 洗煤厂劳务合同范例
- 物业土地授权合同模板
- 灰渣运输合同模板
- 买卖渔船合同范例
- 气体管道采购合同范例
- gmp委托生产合同范例
- 《过秦论》理解性默写练习 课件20张 统编版高中语文选择性必修中册
- 国家开放大学《西方行政学说》形考任务1-4参考答案
- DB63-T 241-2021草地毒害草综合治理技术规范
- 中国传统文化十二生肖介绍PPT课件(带内容)
- 结直肠的锯齿状病变及其肿瘤课件
- HR三支柱-人力资源转型与创新
- 《国家安全法》 详解课件
- 最新钠冷快堆中的结构材料课件
- 气切套管(金属)的护理操作考核评价标准
- 海康威视内部培训教材1
- DB22T 5016-2019 市政工程资料管理标准
评论
0/150
提交评论