首页 用户坐标、视图坐标、Java awt坐标概念的建立和应用

用户坐标、视图坐标、Java awt坐标概念的建立和应用

举报
开通vip

用户坐标、视图坐标、Java awt坐标概念的建立和应用实验1实验报告格式《计算机图形学》实验1实验报告实验题目:用户坐标、视图坐标、Javaawt坐标概念的建立和应用实验内容:掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。编写自己的算法函数,并形成Java语言程序包。编写程序调用验证之。参考程序:有两个示范程序MyCanvas.java和MyLineDrawApplet.java基本概念:用户坐标:是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。视图坐标:是设备相关的坐标,随目标渲染设备不同而不同。Java awt坐标:使用ja...

用户坐标、视图坐标、Java awt坐标概念的建立和应用
实验1实验报告 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 《计算机图形学》实验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=viewMinx[i]&&s<=viewMaxx[i]&&t>=viewMiny[i]&&t<=viewMaxy[i])returni;}return0;}//视图到用户坐标系的反向转换(x坐标)publicdoublegetUserX(intix,intv){doublet=(double)(ix)/(double)windowWidth;doublex=userMinx+(t-viewMinx[v])/(viewMaxx[v]-viewMinx[v])*(userMaxx-userMinx);returnx;}//视图到用户坐标系的反向转换(y坐标)publicdoublegetUserY(intiy,intv){doublet=(double)(windowHeight-iy)/(double)windowHeight;doubley=userMiny+(t-viewMiny[v])/(viewMaxy[v]-viewMiny[v])*(userMaxy-userMiny);returny;}//******线段光栅化的成员变量********protectedImageimage;//Java图像类的对象protectedMemoryImageSourcemis;//内存图像数据源protectedintpixelWidth;//图像点阵的宽度(像素数)protectedintpixelHeight;//图像点阵的高度(像素数)protectedint[]pixel;//存放图像点的颜色(行优先一维存放)protectedintxoffset;//像素数据窗口内X坐标的偏移protectedintyoffset;//像素数据窗口内Y坐标的偏移//直线(光栅化)实数型Bresenham算法publicvoidrasterizeDrawLine(doublex1,doubley1,doublex2,doubley2){doubleleftTopx,leftTopy;//从用户坐标到JavaAWT坐标intix1=getX(x1);intiy1=windowHeight-getY(y1);//到窗口下方的像素数intix2=getX(x2);intiy2=windowHeight-getY(y2);//到窗口下方的像素数if(x10)?1:-1;//取正负号,1或者-1intsy=(dy>0)?1:-1;intx=ix1;//x从ix1开始循环inty=iy1;//y从iy1开始循环if(adx==0){//说明这是平行于Y轴的直线for(intj=1;j<=ady;j++){myPutPixel(x,y);//调用同类成员函数,设当前定像素颜色y+=sy;//y坐标的改变量为1或者-1个像素}}elseif(ady==0){//说明这是平行于x轴的直线for(inti=1;i<=adx;i++){myPutPixel(x,y);//调用同类成员函数,设当前定像素颜色i+=sx;//x坐标的改变量为1或者-1个像素}}elseif(adx>ady){//直线走向贴近x轴方向doubled=(double)dy/(double)dx;//直线斜率doublety=(double)y;for(inti=1;i<=adx;i++,x+=sx){//x增加1或者-1个像素myPutPixel(x,y);//调用同类成员函数,设定当前像素颜色ty+=sx*d;//y坐标相应的改变量(像素)if(Math.abs(ty-y)>Math.abs(ty-y-sy))y+=sy;//沿y向前进了一个像素}}else{//直线走向贴近Y轴方向(adx<=ady)doubled=(double)dx/(double)dy;//直线斜率doubletx=(double)x;for(intj=1;j<=ady;j++,y+=sy){//y增加1或者-1个像素myPutPixel(x,y);//调用同类成员函数,设当前定像素颜色tx+=sy*d;//y坐标相应的改变量(像素)if(Math.abs(tx-x)>Math.abs(tx-x-sx))x+=sx;//沿x向前进了一个像素}}/**作成内存图像源**/mis=newMemoryImageSource(pixelWidth,pixelHeight,pixel,0,pixelWidth);//生成内存图像有五个参数image=createImage(mis);//生成图像/**调用显示图像方法,需要四个参数**/myDrawImage(image,leftTopx,leftTopy,this);}//结束Bresenham算法//设定当前像素的颜色publicvoidmyPutPixel(inti,intj){intr=getColor().getRed()&0xff;//获取当前红色值intg=getColor().getGreen()&0xff;//绿色值intb=getColor().getBlue()&0xff;//蓝色值inta=0xff000000|(r<<16)|(g<<8)|b;//组成像素值为32位二进制数,存放到像素数组的相应位置pixel[(pixelHeight-1-(j-yoffset))*pixelWidth+(i-xoffset)]=a;//其它位置为初始设置的透明色,不覆盖原来已显示的像素}//图像的显示publicbooleanmyDrawImage(Imageimg,doublex,doubley,ImageObserverobserver){//从用户坐标点转换到JavaAWT坐标intix=getX(x);intiy=getY(y);//调用AWT的图像显示returngraphics.drawImage(img,ix,iy,observer);}//******画笔移动方法*******protecteddoublelastX=0;//画笔当前位置X坐标protecteddoublelastY=0;//画笔当前位置Y坐标//抬笔移动到指定位置publicvoidmoveTo(doublex,doubley){lastX=x;//更新画笔的当前位置lastY=y;}//落笔移动到指定位置publicvoidlineTo(doublex,doubley){drawLine(lastX,lastY,x,y);//画直线lastX=x;//更新画笔的当前位置lastY=y;}}//结束Mycanvas类//测试类MyTest开始packageshiyan1;importjava.applet.Applet;importjava.awt.Color;importjava.awt.Graphics;publicclassMyTestextendsApplet{MyCanvasm;//定义对象//Applet程序的自动初始化方法publicvoidinit(){m=newMyCanvas(this);//构造方法有参数this.setSize(400,400);}//Applet程序的绘图方法publicvoidpaint(Graphicsg){m.setBackground(newColor(200,200,200));//背景色灰白m.setColor(Color.black);//设定前景色为黑色m.setWindow(-1,1,-1,1);//设定用户坐标系范围//画X轴double[]x1={2,2.1,2};//箭头三个点的X坐标double[]y1={-0.96,-1,-1.04};//箭头三个点的Y坐标m.drawLine(-2,-1,2,-1);//画X轴m.fillPolygon(x1,y1,3);//填充箭头m.drawString("X轴",2.2,-1.1);//X轴写字符串//画Y轴double[]y2={0.95,1.0,0.95};//箭头三个点的Y坐标double[]x2={-0.03,0.0,0.03};//箭头三个点的X坐标m.drawLine(0,-2,0,1);//画Y轴m.fillPolygon(x2,y2,3);//填充箭头m.drawString("Y轴",-0.2,0.9);//Y轴写字符串m.drawLine(-1,-1,1,1);//画直线//绘制矩形,左下角坐标为(-0.5,-0.5),右上角坐标为(0.7,0.4)m.setColor(Color.yellow);//设置前景色为黄色,即矩形框为黄色m.drawRect(-0.5,-0.5,0.7,0.4);//给该矩形进行填充,填充图形为矩形,左下角坐标为(-0.25,-0.25),右上角坐标为(0.35,0.2)m.setColor(Color.BLUE);//设置前景色为蓝色,即填充色为蓝色m.fillRect(-0.25,-0.25,0.35,0.2);//在矩形下方绘制一个椭圆//圆心坐标为(0,-1),两个半径为0.8和0.4m.setColor(Color.green);//设置前景色为绿色,即椭圆框为绿色m.drawOval(0,-1,0.8,0.4);//对椭圆进行填充//圆心坐标为(0,-0.9),两个半径为0.4和0.2m.setColor(Color.white);//设置前景色为白色,即填充色为白色m.fillOval(0,-0.9,0.4,0.2);m.setColor(Color.red);//设置前景色为红色,即字符串的颜色为红色m.drawString("用户坐标系下矩形与椭圆的填充",0.8,-2.5);}}//测试类MyTest结束运行结果:(给出运行结果的截屏和说明)先画出x轴与y轴,然后画出一条直线,再画出矩形框,对矩形框进行填充,接下来画出椭圆框,最后对其进行填充,中间也有对图形的颜色进行填充。实验体会:1、初步了解了用户坐标、视图坐标和AWT坐标,并且明白了三者之间是如何进行相互转换,也对java2D有了一个基本的了解。 2、巩固了java的基础知识,提高了java编程的熟练度。 3、对于用java语言绘制图形与填充有了一个全面的认识。 
本文档为【用户坐标、视图坐标、Java awt坐标概念的建立和应用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
hw93705
暂无简介~
格式:doc
大小:135KB
软件:Word
页数:23
分类:
上传时间:2023-03-02
浏览量:0