计算机图形学实验6实验报告.docx
- 文档编号:2808227
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:20
- 大小:1.16MB
计算机图形学实验6实验报告.docx
《计算机图形学实验6实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验6实验报告.docx(20页珍藏版)》请在冰点文库上搜索。
计算机图形学实验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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)