《计算机图形学》实验1实验报告解析.docx
《《计算机图形学》实验1实验报告解析.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》实验1实验报告解析.docx(26页珍藏版)》请在冰点文库上搜索。
《计算机图形学》实验1实验报告解析
《计算机图形学》实验1实验报告
实验题目:
用户坐标、视图坐标、Javaawt坐标概念的建立和应用
实验内容:
掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。
编写自己的算法函数,并形成Java语言程序包。
编写程序调用验证之。
基本概念:
(详细叙述自己对实验内容的理解)
本实验建立用户坐标和视图坐标以及Javaawt坐标。
用户坐标:
用户自定义设计并建立的坐标。
视图坐标:
根据视图的不同,初始坐标不同,如下面的矩形和椭圆的画法。
Javaawt坐标:
窗口显示图像的边界图标。
算法设计:
(详细叙述自己设计程序的功能、算法及实现)
publicabstractvoiddrawLine(intx1,inty1,intx2,inty2)
使用当前颜色,在点(x1,y1)和(x2,y2)之间画线。
publicabstractvoiddrawOval(intx,inty,intwidth,intheight)
画椭圆。
publicabstractvoidfillOval(intx,inty,intwidth,intheight)
画实心椭圆。
publicabstractvoiddrawPolygon(int[]xPoints,int[]yPoints,intnPoints)
画x和y坐标定义的多边形。
publicvoiddrawRect(intx,inty,intwidth,intheight)
画矩形。
publicvoiddrawRect(intx,inty,intwidth,intheight)
画实心矩形。
publicabstractvoiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)
使用当前颜色画圆角矩形。
publicabstractvoiddrawString(Stringstr,intx,inty)
使用当前字体和颜色画字符串str。
publicabstractvoidsetColor(Colorc)
设置图形上下文的当前颜色。
publicabstractvoidsetPaintMode()
设置画模式。
publicabstractbooleandrawImage(Imageimg,intx,inty,ImageObserverobserver)
画特定图。
publicabstractvoidsetFont(Fontfont)
设置特定的font字体。
使用时首先得到font对象的一个实例,Font类常用构造函数为:
publicFont(Stringname,intstyle,intsize)
publicColor(intred,intgreen,intblue,intalpha)
其中:
前三个分量即RGB颜色模式中的参数,第四个alpha分量指透明的程度。
当alpha分量为255时,表示完全不透明,正常显示;当alpha分量为0时,表示完全透明,前三个分量不起作用,而介于0~255之间的值可以制造出颜色不同的层次效果。
代码:
(给出和实验内容相关的Java程序和注解,不要辅助代码,否则扣分)
//定义主类MyCoordinate
publicclassMyCoordinateextendsApplet{
MyCanvasm;//定义对象
//Applet程序的自动初始化方法
publicvoidinit(){
m=newMyCanvas(this);//构造方法有参数
}
//Applet程序的绘图方法
publicvoidpaint(Graphicsg){
m.setBackground(newColor(251,254,30));//背景色黄色
m.setColor(Color.black);//设定前景色为黑色
m.setWindow(-1,1,-1,1);//设定用户坐标系范围
//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样
//画X轴
double[]x1={0.95,1.0,0.95};//箭头三个点的X坐标
double[]y1={-0.03,0.0,0.03};//箭头三个点的Y坐标
m.drawLine(-1,0,1,0);//画X轴
m.fillPolygon(x1,y1,3);//填充箭头
m.drawString("X轴",0.8,-0.1);//X轴写字符串
//画Y轴
double[]y2={0.95,1.0,0.95};//箭头三个点的Y坐标
double[]x2={-0.03,0.0,0.03};//箭头三个点的X坐标
m.drawLine(0,-1,0,1);//画Y轴
m.fillPolygon(x2,y2,3);//填充箭头
m.drawString("Y轴",-0.2,0.9);//Y轴写字符串
//画圆
m.setColor(Color.red);//设定前景色为红色
m.fillOval(0.7,-0.7,0.05,0.05);//画圆
m.drawString("我的当前位置",0.3,-0.9);//标记我的位置
//画线
m.setColor(Color.blue);//设定前景色为蓝色
m.drawLine(0.7,-0.69,-0.7,0.71);
m.drawLine(0.7,-0.71,-0.7,0.69);
//画箭头
double[]x3={-0.78,-0.72,-0.66};//箭头三个点的X坐标
double[]y3={0.78,0.66,0.72};//箭头三个点的y坐标
m.fillPolygon(x3,y3,3);//填充箭头
//画五角星(我的目标位置)
m.setColor(newColor(243,33,13));
double[]x4={-0.9,-0.88,-0.9,-0.86,-0.84,-0.82,-0.78,-0.80,-0.78,-0.84};
double[]y4={0.78,0.84,0.86,0.86,0.91,0.86,0.86,0.84,0.78,0.81};
m.fillPolygon(x4,y4,10);//填充五角星
m.setColor(Color.red);
m.drawString("我的目标地",-0.75,0.80);
//北指标
double[]x5={0.85,0.90,0.95};
double[]y5={0.85,0.95,0.85};
m.setColor(Color.red);
m.fillPolygon(x5,y5,3);
m.drawString("北",0.7,0.7);
m.drawLine(0.9,0.6,0.9,0.85);
//画矩形(草坪)
m.setColor(Color.green);
m.fillRoundRect(-0.7,-0.6,-0.1,-0.1,0.05,0.05);
m.setColor(Color.black);
m.drawString("草坪",-0.5,-0.4);
//圆弧的画法(湖泊)
m.setColor(newColor(9,248,228));
m.fillOval(0.4,0.4,0.4,0.3);
m.setColor(Color.black);
m.drawString("美女湖",0.2,0.4);
}
}//主类MyCoordinate
运行结果:
(给出运行结果的截屏和说明)
实验体会:
(简单说明学习到的知识点和收获)
参考程序:
有两个示范程序MyCanvas.java和MyLineDrawApplet.java
1.示范程序MyCanvas.java
//文件名:
MyCanvas.java
//定义用户的canvas类,实现
//从用户坐标到视图的转换
//视图到JavaAWT坐标的转换
//用户坐标系的二维图形的描画方法,等
//用编译命令javac-d.MyCanvas.java把本文件制作成包MyCanvas
//在调用这个包的程序里加入语句importMyCanvas.MyCanvas;
packageMyCanvas;//制作的包名,这里包名和类名同
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=(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.