《计算机图形学》实验1实验报告解析.docx

上传人:b****3 文档编号:10312312 上传时间:2023-05-25 格式:DOCX 页数:26 大小:31.66KB
下载 相关 举报
《计算机图形学》实验1实验报告解析.docx_第1页
第1页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第2页
第2页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第3页
第3页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第4页
第4页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第5页
第5页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第6页
第6页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第7页
第7页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第8页
第8页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第9页
第9页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第10页
第10页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第11页
第11页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第12页
第12页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第13页
第13页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第14页
第14页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第15页
第15页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第16页
第16页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第17页
第17页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第18页
第18页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第19页
第19页 / 共26页
《计算机图形学》实验1实验报告解析.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

《计算机图形学》实验1实验报告解析.docx

《《计算机图形学》实验1实验报告解析.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》实验1实验报告解析.docx(26页珍藏版)》请在冰点文库上搜索。

《计算机图形学》实验1实验报告解析.docx

《计算机图形学》实验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=(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.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2