实验1实验报告格式_第1页
实验1实验报告格式_第2页
实验1实验报告格式_第3页
实验1实验报告格式_第4页
实验1实验报告格式_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验1实验报告格式《计算机图形学》实验1实验报告实验题目:用户坐标、视图坐标、Javaawt坐标概念的建立和应用实验内容:掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。编写自己的算法函数,并形成Java语言程序包。编写程序调用验证之。参考程序:有两个示范程序MyTest.java和MyLineDrawApplet.java基本概念:用户坐标:是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。应用程序使用该坐标系:所有传给Java2D渲染过程的坐标都是指用户坐标。例如下面程序中的默认用户坐标的范围是X轴从-1到1,Y轴也是凑够-1到1。视图坐标:是设备相关的坐标,随目标渲染设备不同而不同。下面程序中定义的视图坐标的缺省值为(0,0)和(1,1)。Javaawt坐标:使用java.awt时使用的坐标,即窗口显示图像时的边界坐标。填充:这个过程可以抽象的理解为以已知的线为中心,向周围扩展像素,然后对这些像素所在的方块进行着色。将用户坐标转换为视图坐标实际上是将独立于设备的逻辑坐标转换为设备相关的坐标,将视图坐标转化为AWT坐标就是将视图坐标按照显示窗口的大小进行缩放。算法设计:(详细叙述自己设计程序的功能、算法及实现)程序的功能:可以根据传入的用户坐标进行视图坐标、AWT坐标之间的转换,其反向转换同理也可以实现,即将转换的方法逆过去即可。此外,程序还可以进行图形的绘画和填充,比如矩形、椭圆、多边形等。算法及其实现函数:用户坐标到视图坐标的转换:对于相应的用户坐标应用数学中的平移与放缩,就可以得到视图坐标。具体方法如下:在用户坐标系下,设矩形窗口的左下角坐标为(Uxl,Uyb),右上角为(Uxr,Uyt),视图坐标系下的两个点坐标分别为(Vx1,Vyb)和(Vxr,Vyt),则视图坐标的表达式为:(Xu,YU)是已知的用户坐标,(Xv,Yv)是要求的视图坐标Xv=aXu+bYv=cYu+d其中:a=(Vxr-Vxl)/(Uxr-Uxl)b=Vxl-aUxlc=(Vyt-Vyb)/(Uyt-Uyb) d=Vyb-cUyb//将用户坐标的点转换到视图坐标publicdoubleview_x(doublex){doubles=(x-user_i_x)/(user_a_x-user_i_x);doublet=view_i_x[currentView]+s*//坐标的平移及压缩(view_a_x[currentView]-view_i_x[currentView]);returnt;}publicdoubleview_y(doubley){doubles=(y-user_i_y)/(user_a_y-user_i_y);doublet=view_i_y[currentView]+s*//坐标的平移及压缩(view_a_y[currentView]-view_i_y[currentView]);returnt;}视图坐标到AWT坐标的转换:由于视图坐标在0到1之间,因此将显示窗口的宽和高按照视图坐标缩小就得到AWT坐标。具体算法如下:视图坐标为(Vx,Vy),窗口的宽和高分别为:Ww和Wh,AWT坐标为(X,Y),其中X、Y均为整数,因此计算之后应将计算结果转为整数,并且与V/坐标方向相反。那么X=Vx*WwY=(1-Vy)*Wh〃将视图坐标系的点转换到JavaAWT坐标publicintgetIntX(doublex){return(int)(windowWidth*x); //注意视图坐标0-1之间}publicintgetIntY(doubley){return(int)(windowHeight*(1-y)); //Y轴方向相反}用户坐标到AWT坐标的转换:先按照用户坐标转视图坐标的方法转为视图坐标,然后按照视图坐标转AWT坐标的方法转为AWT坐标,简而言之,就是将第一种和第二种转换相结合。〃将用户坐标的点转换到JavaAWT坐标publicintgetX(doublex){doublexx=view_x(x);//先将x转换到视图坐标intix=getIntX(xx);//将视图坐标转换到JavaAWT坐标returnix;}publicintgetY(doubley){doubleyy=view_y(y);//先将y转换到视图坐标intiy=getIntY(yy);//将视图坐标转换到JavaAWT坐标returniy;}椭圆的画法:用到圆心坐标和两个半径,画的时候首先将用户坐标转成javaAWT坐标。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);}代码:(给出主要的Java程序和注解)packagefirst;importjava.io.*;importjava.awt.*;importjava.awt.image.*;//定义容器类publicclassMyTestextendsComponent{//用户坐标系范围缺省值([-1,1],[-1,1])protecteddoubleuser_i_x=-1; //用户坐标系X轴的最小值protecteddoubleuser_a_x=l;〃用户坐标系X轴的最大值protecteddoubleuser_i_y=-1;//用户坐标系Y轴的最小值protecteddoubleuser_a_y=1;〃用户坐标系Y轴的最大值〃视图的坐标范围缺省值([0,1],[0,1])protecteddouble[]view_i_x;//各视图X轴最小值的数组protecteddouble[]view_a_x;//各视图X轴最大值的数组protecteddouble]]view_i_y;//各视图Y轴最小值的数组protecteddouble]]view_a_y;〃各视图Y轴最大值的数组finalstaticintDefaultViewport_a=256;//缺省的视图数protectedintviewport_a=DefaultViewport_a; //最大视图数protectedintviewportNum=0; //当前视图数protectedintcurrentView=0;//当前视图的索引号//窗口大小finalstaticintDefaultWindowSize=256; //缺省的窗口大小protectedintwindowWidth=DefaultWindowSize;〃窗口宽度protectedintwindowHeight=DefaultWindowSize; //窗口宽度//定义JavaAWT的Graphics和ComponentprotectedGraphicsgraphics;//MyTest的Graphics数据类protectedComponentcomponent;//MyTest的component数据类protectedColorfontColor=Color.white;〃当前前景颜色protectedColorbackColor=Color.white; //当前背景色//构造方法publicMyTest(Componenta){component=a;//设定MyTest类所用的Componentgraphics=a.getGraphics(); 〃设定MyTest类所用的graphicswindowWidth=a.getSize().width;//窗口宽度windowHeight=a.getSize().height;//窗口高度createViewport(DefaultViewport_a);//创建视图}//创建视图privatevoidcreateViewport(intmax){currentView=0; //设定当前视图索引号viewport_a=max;//设定视图数的最大值view_i_x=newdouble]viewport_a]; //存放各视图 X轴最小值view_a_x=newdouble]viewport_a]; //存放各视图 X轴最大值view_i_y=newdouble]viewport_a]; //存放各视图 y轴最小值view_a_y=newdouble]viewport_a]; //存放各视图 y轴最大值view_i_x]currentView]=0.0;//设定当前视图的坐标轴范围view_i_y]currentView]=0.0;view_a_x]currentView]=1.0;view_a_y]currentView]=1.0;viewportNum=1;//当前视图数}//设定用户坐标系范围publicvoidsetWindow(doublex1,doublex2,doubley1,doubley2){user_i_x=xl;〃设定窗口(用户坐标系)X轴的最小值user_a_x=x2;//设定窗口(用户坐标系)X轴的最大值user_i_y=yl;//设定窗口(用户坐标系)y轴的最小值user_a_y=y2;//设定窗口(用户坐标系)y轴的最大值}//设定视图publicvoidsetViewport(doublexl,doublex2,doubleyl,doubley2){currentView=viewportNum;//设定新的当前视图索引号viewportNum++;//当前视图数加lview_i_x[currentView]=xl;//存放视图的X轴最小值view_a_x[currentView]=x2;//存放视图的X轴最大值view_i_y[currentView]=yl;//存放视图的y轴最小值view_a_y[currentView]=y2;//存放视图的y轴最大值}//视图复位publicvoidresetViewport(){currentView=0; //当前视图索引号重归于零view_i_x[currentView]=0.0;//设定当前视图的坐标轴范围view_i_y[currentView]=0.0;view_a_x[currentView]=l.0;view_a_y[currentView]=l.0;viewportNum=l;//当前视图数}//将视图坐标系的点转换到JavaAWT坐标publicintgetIntX(doublex){return(int)(windowWidth*x); //注意视图坐标0-l之间}publicintgetIntY(doubley){return(int)(windowHeight*(l-y)); //Y轴方向相反}//将用户坐标的点转换到视图坐标publicdoubleview_x(doublex){doubles=(x-user_i_x)/(user_a_x-user_i_x);doublet=view_i_x[currentView]+s* //坐标的平移及压缩(view_a_x[currentView]-view_i_x[currentView]);returnt;}publicdoubleview_y(doubley){doubles=(y-user_i_y)/(user_a_y-user_i_y);doublet=view_i_y[currentView]+s* //坐标的平移及压缩(view_a_y[currentView]-view_i_y[currentView]);returnt;}//将用户坐标的点转换到JavaAWT坐标publicintgetX(doublex){doublexx=view_x(x);//先将x转换到视图坐标intix=getIntX(xx);//将视图坐标转换到JavaAWT坐标returnix;}publicintgetY(doubley){doubleyy=view_y(y);//先将y转换到视图坐标intiy=getIntY(yy);//将视图坐标转换到JavaAWT坐标returniy;}//将用户坐标系的宽度、高度值投影到JavaAWT坐标publicintgetDimensionX(doublew){doublex=view_a_x[currentView]-view_i_x[currentView];x*=windowWidth*w/(user_a_x-user_i_x);//按比例投影,经由视图坐标系return((int)Math.abs(x)); //用户坐标系可能反向}publicintgetDimensionY(doubleh){doubley=view_a_y[currentView]-view_i_y[currentView];y*=windowHeight*h/(user_a_y-user_i_y);//按比例投影,经由视图坐标系return((int)Math.abs(y)); //用户坐标系可能反向}//有关当前颜色的设定方法:画笔颜色、前景色、背景色publicColorgetColor(){returnfontColor;//得到当前颜色序号}publicvoidsetColor(Colorc){graphics.setColor(c);//设置图形对象的颜色fontColor=c;//设定当前颜色序号}publicColorgetForeground(){returnfontColor;//得到当前前景色序号}publicvoidsetForeground(Colorc){component.setForeground(c);//设置前景色fontColor=c;//设定当前前景色序号}publicColorgetBackground(){returnbackColor;//得到当前背景色序号}publicvoidsetBackground(Colorc){component.setBackground(c); //设置背景色backColor=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);//填充算法如何实现?}//椭圆的画法(圆心坐标和两个半径)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);}//椭圆的填充(圆心坐标和两个半径)publicvoidfillOval(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.fillOval(x0,y0,2*ixr,2*iyr);}//多边形publicvoiddrawPolygon(double[]x,double[]y,intnumPoints){int[]ix=newint[numPoints];int[]iy=newint[numPoints];for(inti=0;i<numPoints;i++){ix[i]=getX(x[i]);//从用户坐标点转换到JavaAWT坐标iy[i]=getY(y[i]);}graphics.drawPolygon(ix,iy,numPoints); //封闭的折线图}//多边形填充publicvoidfillPolygon(double[]x,double[]y,intnumPoints){int[]ix=newint[numPoints];int[]iy=newint[numPoints];for(inti=0;i<numPoints;i++){ix[i]=getX(x[i]);//从用户坐标点转换到JavaAWT坐标iy[i]=getY(y[i]);}graphics.fillPolygon(ix,iy,numPoints);//掌握填充的算法是重点}//写字符串publicvoiddrawString(Stringstr,doublex,doubley){//从用户坐标点转换到JavaAWT坐标intix=getX(x);intiy=getY(y);graphics.drawString(str,ix,iy);}//获取当前Graphics类的字体publicFontgetFont(){returngraphics.getFont();}//设定当前Graphics类的字体publicvoidsetFont(Fontf){graphics.setFont(f);}//定义一种字体:仅对window已有字体放大尺寸publicFontMyFont(Stringname,intstyle,doublesize){intDefaultFontSize=12;if(size<=0)size=1.0; //字体大小不能为负数intisize=(int)(DefaultFontSize*size);//定义字体的大小Fontf=newFont(name,style,isize); //构造字体returnf;}//JavaAWT坐标系到视图坐标系的反向转换publicintgetViewport(intix,intiy){if(viewportNum==1)return0; //默认视图doubles=(double)(ix)/(double)windowWidth;doublet=(double)(windowHeight-iy)/(double)windowHeight;for(inti=0;i<viewportNum;i++){//视图索引号if(s>=view_i_x[i]&&s<=view_a_x[i]&&t>=view_i_y[i]&&t<=view_a_y[i])returni;}return0;}〃视图到用户坐标系的反向转换(X坐标)publicdoublegetUserX(intix,intv){doublet=(double)(iX)/(double)windowWidth;doubleX=user_i_X+(t-view_i_X[v])/(view_a_X[v]-view_i_X[v])*(user_a_X-user_i_X);returnX;}〃视图到用户坐标系的反向转换(y坐标)publicdoublegetUserY(intiy,intv){doublet=(double)(windowHeight-iy)/(double)windowHeight;doubley=user_i_y+(t-view_i_y[v])/(view_a_y[v]-view_i_y[v])*(user_a_y-user_i_y);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(x1<x2){leftTopx=xl;〃左上角的X坐标值设为xl(用户坐标)xoffset=ix1;//窗口中的偏移量是JavaAWT坐标}else{leftTopx=x2;〃左上角的X坐标值设为x2(用户坐标)xoffset=ix2;//窗口中的偏移量是JavaAWT坐标}if(y1vy2){ 〃用户坐标原点在左下,JavaAWT在左上leftTopy=y2;//左上角的y坐标值设为y2yoffset=iy1;//窗口中的偏移量是JavaAWT坐标}else{ 〃用户坐标原点在左下,JavaAWT在左上leftTopy=y1;〃左上角的y坐标值设为yl(用户坐标)yoffset=iy2;//窗口中的偏移量是JavaAWT坐标}intdx=ix2-ix1; 〃取得X向的间距intdy=iy2-iy1; 〃取得y向的间距intadx=Math.abs(dx);//X向的间距的绝对值intady=Math.abs(dy);//Y向的间距的绝对值pixelWidth=adx+1;//图像点阵的宽度(像素数)pixelHeight=ady+1; //图像点阵的高度(像素数)//一维数组存放图像点的颜色(行优先)pixel=newint[pixelWidth*pixelHeight];for(intk=0;k<pixelWidth*pixelHeight;k++)pixel[k]=0x00000000; //预设透明背景,32位0intsx=(dx>0)?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轴方向(adxv=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;}}//结束MyTest类packagefirst;importfirst.MyTest; //引入自制包中的类MyTestimportjava.applet.Applet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论