计算机图形学实验6实验报告.docx

上传人:b****1 文档编号:2808227 上传时间:2023-05-04 格式:DOCX 页数:20 大小:1.16MB
下载 相关 举报
计算机图形学实验6实验报告.docx_第1页
第1页 / 共20页
计算机图形学实验6实验报告.docx_第2页
第2页 / 共20页
计算机图形学实验6实验报告.docx_第3页
第3页 / 共20页
计算机图形学实验6实验报告.docx_第4页
第4页 / 共20页
计算机图形学实验6实验报告.docx_第5页
第5页 / 共20页
计算机图形学实验6实验报告.docx_第6页
第6页 / 共20页
计算机图形学实验6实验报告.docx_第7页
第7页 / 共20页
计算机图形学实验6实验报告.docx_第8页
第8页 / 共20页
计算机图形学实验6实验报告.docx_第9页
第9页 / 共20页
计算机图形学实验6实验报告.docx_第10页
第10页 / 共20页
计算机图形学实验6实验报告.docx_第11页
第11页 / 共20页
计算机图形学实验6实验报告.docx_第12页
第12页 / 共20页
计算机图形学实验6实验报告.docx_第13页
第13页 / 共20页
计算机图形学实验6实验报告.docx_第14页
第14页 / 共20页
计算机图形学实验6实验报告.docx_第15页
第15页 / 共20页
计算机图形学实验6实验报告.docx_第16页
第16页 / 共20页
计算机图形学实验6实验报告.docx_第17页
第17页 / 共20页
计算机图形学实验6实验报告.docx_第18页
第18页 / 共20页
计算机图形学实验6实验报告.docx_第19页
第19页 / 共20页
计算机图形学实验6实验报告.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机图形学实验6实验报告.docx

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

计算机图形学实验6实验报告.docx

计算机图形学实验6实验报告

《计算机图形学》实验6实验报告

实验题目:

简单Java绘图板程序

实验内容:

1阅读理解本试验提供的参考资料。

2编写并调通一个简单绘图板的java程序。

参考资料:

1pb.java

2Java图形处理介绍.doc

基本概念:

直接颜色模型(DirectColorModel):

直接颜色模型在程序中指定整型数中的多少位和哪些位分别用于表示alpaha、红、绿、蓝四个属性。

索引颜色模型:

索引颜色模型把颜色值看成红、绿、蓝数值查找表中的索引,在Java中索引是个字节。

实际要查找3个表,各对应一个主颜色(另外,你还可以用第4个表查找ALPHA)。

每个表项包含8位,用于指定颜色强度。

图形观察者(ImageObserver):

图形观察者机制是Observer设计模式的一个例子。

其思路是让任意个其它对象“观察”一个对象。

被观察对象产生观察者要知道的改变时,被观察对象调用所有观察者。

被观察对象可以决定何时通知观察者。

媒介跟踪器(MediaTracker):

媒介跟踪器MediaTracker在处理动画播放程序或多幅图象时有广泛的应用。

为达到图象平滑的效果,通常小程序和应用程序要在某个图形完全装入后才能工作。

内存图形源(MemoryImageSource):

在Java中另一种图形源是内存:

可以在程序中建立整形或字节数组来表示图素值,并利用Java的MemoryImageSource类构造Image的实例。

过滤器(ImageFilter):

AWT通过允许你在图象生成者和图象使用者之间插入图象过滤器的方式支持对图象的操作。

一个图象过滤器实际上就是一个ImageFilter类,它放置在一个生产者和一个使用者之间,在使用者得到图象之前改变图象的数据。

客户程序:

客户程序由三个类组成:

client类,network类和writer类。

Client类是其主体部分,此类由Frame类扩展而来,Writer类是在network类中启动的线程。

算法设计:

1、绘图方法paint()

publicvoidpaint(Graphicsg){

Graphics2Dg2d=(Graphics2D)g;

Pointp1,p2;

n=paintInfo.size();//几何图元信息

if(toolFlag==2)

g.clearRect(0,0,getSize().width,getSize().height);//清除

for(inti=0;i

p1=(Point)paintInfo.elementAt(i);

p2=(Point)paintInfo.elementAt(i+1);

size=newBasicStroke(p1.boarder,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

g2d.setColor(p1.col);

g2d.setStroke(size);

绘制图形用到类Graphics2D,其中包括很多绘制图形的方法,定义一个Graphics2D类g,用getGraphics()来得到一个Graphics2D对象,它相当于组建的绘图环境,可以进行各种绘图操作。

定义一个BasicStroke类size来确定画笔的大小,其中BasicStroke类定义针对图形图元轮廓呈现属性的一个基本集合,这些图元使用Graphics2D 对象呈现,而该对象的Stroke 属性设置为此BasicStroke。

其中con为画笔宽度,CAP_BUTT指无装饰地结束未封闭的子路径和虚线线段,JOIN_BEVEL通过直线连接宽体轮廓的外角,将路径线段连接在一起。

2、实现画笔、橡皮、直线,椭圆和矩形的绘制。

if(p1.tool==p2.tool){

switch(p1.tool){

case0:

//画笔

Line2Dline1=newLine2D.Double(p1.x,p1.y,p2.x,p2.y);

g2d.draw(line1);

break;

case1:

//橡皮

g.clearRect(p1.x,p1.y,p1.boarder,p1.boarder);

break;

case3:

//画直线

Line2Dline2=newLine2D.Double(p1.x,p1.y,p2.x,p2.y);

g2d.draw(line2);

break;

case4:

//画圆

Ellipse2Dellipse=newEllipse2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y));

g2d.draw(ellipse);

break;

case5:

//画矩形

Rectangle2Drect=newRectangle2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y));

g2d.draw(rect);

break;

case6:

//截断,跳过

i=i+1;

break;

default:

}//endswitch

}//endif

}//endfor

}//end绘图方法paint()

}

3、对画笔大小的设定,和对橡皮大小的设定。

Stringselected=SizeChoice.getSelectedItem();

if(selected=="1"){

con=1;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

{//橡皮大小

StringEsize=EraserChoice.getSelectedItem();

if(Esize=="5"){Econ=5*2;}

elseif(Esize=="9"){Econ=9*2;}

elseif(Esize=="13"){Econ=13*2;}

elseif(Esize=="17"){Econ=17*3;}

}

代码:

//构造方法

paintboard(Strings){

super(s);

addMouseMotionListener(this);

addMouseListener(this);

paintInfo=newVector();//几何图元信息

/*各工具按钮及选择项*/

//颜色选择

ColChoice=newChoice();

ColChoice.add("black");

ColChoice.add("red");

ColChoice.add("blue");

ColChoice.add("green");

ColChoice.addItemListener(this);

//画笔大小选择

SizeChoice=newChoice();

SizeChoice.add("1");

SizeChoice.add("3");

SizeChoice.add("5");

SizeChoice.add("7");

SizeChoice.add("9");

SizeChoice.addItemListener(this);

//橡皮大小选择

EraserChoice=newChoice();

EraserChoice.add("5");

EraserChoice.add("9");

EraserChoice.add("13");

EraserChoice.add("17");

EraserChoice.addItemListener(this);

toolPanel=newPanel();

//命令按钮

clear=newButton("清除");

eraser=newButton("橡皮");

pen=newButton("画笔");

drLine=newButton("画直线");

drCircle=newButton("画圆形");

drRect=newButton("画矩形");

openPic=newButton("打开图画");

savePic=newButton("保存图画");

colchooser=newButton("显示调色板");

//各组件事件监听

clear.addActionListener(this);

eraser.addActionListener(this);

pen.addActionListener(this);

drLine.addActionListener(this);

drCircle.addActionListener(this);

drRect.addActionListener(this);

openPic.addActionListener(this);

savePic.addActionListener(this);

colchooser.addActionListener(this);

//标签

颜色=newLabel("画笔颜色",Label.CENTER);

大小B=newLabel("画笔大小",Label.CENTER);

大小E=newLabel("橡皮大小",Label.CENTER);

//面板添加组件

toolPanel.add(openPic);

toolPanel.add(savePic);

toolPanel.add(pen);

toolPanel.add(drLine);

toolPanel.add(drCircle);

toolPanel.add(drRect);

toolPanel.add(颜色);toolPanel.add(ColChoice);

toolPanel.add(大小B);toolPanel.add(SizeChoice);

toolPanel.add(colchooser);

toolPanel.add(eraser);

toolPanel.add(大小E);toolPanel.add(EraserChoice);

toolPanel.add(clear);

//工具面板到APPLET面板

add(toolPanel,BorderLayout.NORTH);

setBounds(60,60,900,600);setVisible(true);

validate();//强制显示容器

//dialogforsaveandload

openPicture=newFileDialog(this,"打开图画",FileDialog.LOAD);

openPicture.setVisible(false);

savePicture=newFileDialog(this,"保存图画",FileDialog.SAVE);

savePicture.setVisible(false);

//强制关闭窗口响应方法

openPicture.addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente){

openPicture.setVisible(false);}});

savePicture.addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente){

savePicture.setVisible(false);}});

addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente){

System.exit(0);}});

}//构造方法完毕

//绘图方法paint()

publicvoidpaint(Graphicsg){

Graphics2Dg2d=(Graphics2D)g;

Pointp1,p2;

n=paintInfo.size();//几何图元信息

if(toolFlag==2)

g.clearRect(0,0,getSize().width,getSize().height);//清除

for(inti=0;i

p1=(Point)paintInfo.elementAt(i);

p2=(Point)paintInfo.elementAt(i+1);

size=newBasicStroke(p1.boarder,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

g2d.setColor(p1.col);

g2d.setStroke(size);

if(p1.tool==p2.tool){

switch(p1.tool){

case0:

//画笔

Line2Dline1=newLine2D.Double(p1.x,p1.y,p2.x,p2.y);

g2d.draw(line1);

break;

case1:

//橡皮

g.clearRect(p1.x,p1.y,p1.boarder,p1.boarder);

break;

case3:

//画直线

Line2Dline2=newLine2D.Double(p1.x,p1.y,p2.x,p2.y);

g2d.draw(line2);

break;

case4:

//画圆

Ellipse2Dellipse=newEllipse2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y));

g2d.draw(ellipse);

break;

case5:

//画矩形

Rectangle2Drect=newRectangle2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y));

g2d.draw(rect);

break;

case6:

//截断,跳过

i=i+1;

break;

default:

}//endswitch

}//endif

}//endfor

}//end绘图方法paint()

//下拉式列表响应方法

publicvoiditemStateChanged(ItemEvente){

if(e.getSource()==ColChoice){//预选颜色

Stringname=ColChoice.getSelectedItem();

if(name=="black"){c=newColor(0,0,0);}

elseif(name=="red"){c=newColor(255,0,0);}

elseif(name=="green"){c=newColor(0,255,0);}

elseif(name=="blue"){c=newColor(0,0,255);}

}

elseif(e.getSource()==SizeChoice){//画笔大小

Stringselected=SizeChoice.getSelectedItem();

if(selected=="1"){

con=1;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

elseif(selected=="3"){

con=3;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

elseif(selected=="5"){

con=5;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

elseif(selected=="7"){

con=7;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

elseif(selected=="9"){

con=9;

size=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

}

}//画笔大小if结束

elseif(e.getSource()==EraserChoice){//橡皮大小

StringEsize=EraserChoice.getSelectedItem();

if(Esize=="5"){Econ=5*2;}

elseif(Esize=="9"){Econ=9*2;}

elseif(Esize=="13"){Econ=13*2;}

elseif(Esize=="17"){Econ=17*3;}

}

}//下拉式列表响应方法结束

//鼠标拖曳事件响应方法

publicvoidmouseDragged(MouseEvente){

Pointp1;

switch(toolFlag){

case0:

//画笔

x=(int)e.getX();

y=(int)e.getY();

p1=newPoint(x,y,c,toolFlag,con);

paintInfo.addElement(p1);

repaint();

break;

case1:

//橡皮

x=(int)e.getX();

y=(int)e.getY();

p1=newPoint(x,y,null,toolFlag,Econ);

paintInfo.addElement(p1);

repaint();

break;

default:

}

}//鼠标拖曳事件响应方法结束

publicvoidmouseMoved(MouseEvente){}//鼠标事件

publicvoidupdate(Graphicsg){//刷新重绘

paint(g);

}

//鼠标press事件

publicvoidmousePressed(MouseEvente){

Pointp2;

switch(toolFlag){

case3:

//直线

x=(int)e.getX();

y=(int)e.getY();

p2=newPoint(x,y,c,toolFlag,con);

paintInfo.addElement(p2);

break;

case4:

//圆

x=(int)e.getX();

y=(int)e.getY();

p2=newPoint(x,y,c,toolFlag,con);

paintInfo.addElement(p2);

break;

case5:

//矩形

x=(int)e.getX();

y=(int)e.getY();

p2=newPoint(x,y,c,toolFlag,con);

paintInfo.addElement(p2);

break;

default:

}

}//鼠标press事件结束

//鼠标release事件:

设置几何图元信息后调用paint()

publicvoidmouseReleased(MouseEvente){

Pointp3;

switch(toolFlag){

case0:

//画笔

paintInfo.addElement(cutflag);

break;

case1:

//eraser

paintInfo.addElement(cutflag);

break;

case3:

//直线

x=(int)e.getX();

y=(int

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

当前位置:首页 > PPT模板 > 商务科技

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

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