计算机图形学实验6实验报告
更新时间:2024-06-08 03:05:01 阅读量: 综合文库 文档下载
《计算机图形学》实验6实验报告
实验题目: 简单Java绘图板程序
实验内容:1 阅读理解本试验提供的参考资料。
2编写并调通一个简单绘图板的java程序。
参考资料:1 pb.java 2 Java图形处理介绍.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()
public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; Point p1,p2; n = paintInfo.size(); //几何图元信息 if(toolFlag==2) g.clearRect(0,0,getSize().width,getSize().height);//清除 for(int i=0; i 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) { case 0://画笔 Line2D line1 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y); g2d.draw(line1); break; case 1://橡皮 g.clearRect(p1.x, p1.y, p1.boarder, p1.boarder); break; case 3://画直线 Line2D line2 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y); g2d.draw(line2); break; case 4://画圆 Ellipse2D ellipse = new Ellipse2D.Double(p1.x, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y)); g2d.draw(ellipse); break; case 5://画矩形 Rectangle2D rect = new Rectangle2D.Double(p1.x, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y)); g2d.draw(rect); break; case 6://截断,跳过 i=i+1; break; default : } //end switch } //end if } //end for } //end绘图方法paint() } 3、对画笔大小的设定,和对橡皮大小的设定。 p1.y, p1.y, String selected = SizeChoice.getSelectedItem(); if(selected==\ { con = 1; size = BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } { //橡皮大小 String Esize = EraserChoice.getSelectedItem(); if(Esize==\ { Econ = 5*2; } else if(Esize==\ { Econ = 9*2; } else if(Esize==\ { Econ = 13*2; } else if(Esize==\ { Econ = 17*3; } } 代码: new //构造方法 paintboard(String s) { super(s); addMouseMotionListener(this); addMouseListener(this); paintInfo = new Vector(); //几何图元信息 /*各工具按钮及选择项*/ //颜色选择 ColChoice = new Choice(); ColChoice.add(\ColChoice.add(\ColChoice.add(\ColChoice.add(\ ColChoice.addItemListener(this); //画笔大小选择 SizeChoice = new Choice(); SizeChoice.add(\SizeChoice.add(\SizeChoice.add(\SizeChoice.add(\SizeChoice.add(\ SizeChoice.addItemListener(this); //橡皮大小选择 EraserChoice = new Choice(); EraserChoice.add(\EraserChoice.add(\EraserChoice.add(\EraserChoice.add(\ EraserChoice.addItemListener(this); toolPanel = new Panel(); //命令按钮 clear = new Button(\清除\eraser = new Button(\橡皮\pen = new Button(\画笔\drLine = new Button(\画直线\drCircle = new Button(\画圆形\drRect = new Button(\画矩形\openPic = new Button(\打开图画\savePic = new Button(\保存图画\colchooser = new Button(\显示调色板\//各组件事件监听 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); //标签 颜色 = new Label(\画笔颜色\大小B = new Label(\画笔大小\ 大小E = new Label(\橡皮大小\//面板添加组件 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(); //强制显示容器 //dialog for save and load openPicture = new FileDialog(this,\打开图画 \ openPicture.setVisible(false); savePicture = new FileDialog(this,\保存图画 \ savePicture.setVisible(false); //强制关闭窗口响应方法 openPicture.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { openPicture.setVisible(false); } }); savePicture.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { savePicture.setVisible(false); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);} }); } //构造方法完毕 //绘图方法paint() public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; Point p1,p2; n = paintInfo.size(); //几何图元信息 if(toolFlag==2) g.clearRect(0,0,getSize().width,getSize().height);// 清除 for(int i=0; i p1 = (Point)paintInfo.elementAt(i); p2 = (Point)paintInfo.elementAt(i+1); size = new BasicStroke(p1.boarder,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); g2d.setColor(p1.col); g2d.setStroke(size); if(p1.tool==p2.tool) { switch(p1.tool) { case 0://画笔 Line2D line1 = new Line2D.Double(p1.x, p1.y, g2d.draw(line1); break; p2.x, p2.y); case 1://橡皮 g.clearRect(p1.x, p1.y, p1.boarder, break; p1.boarder); case 3://画直线 Line2D line2 = new Line2D.Double(p1.x, p1.y, g2d.draw(line2); break; p2.x, p2.y); case 4://画圆 Ellipse2D ellipse = new Ellipse2D.Double(p1.x, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y)); g2d.draw(ellipse); break; case 5://画矩形 Rectangle2D rect = new Rectangle2D.Double(p1.x, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y)); g2d.draw(rect); break; case 6://截断,跳过 i=i+1; break; default : } //end switch } //end if } //end for } //end绘图方法paint() //下拉式列表响应方法 public void itemStateChanged(ItemEvent e) { if(e.getSource()==ColChoice) { //预选颜色 String name = ColChoice.getSelectedItem(); if(name==\ else if(name==\ else if(name==\ else if(name==\} else if(e.getSource()==SizeChoice) { //画笔大小 String selected = SizeChoice.getSelectedItem(); if(selected==\ con = 1; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } else if(selected==\ con = 3; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } else if(selected==\ con = 5; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } else if(selected==\ con = 7; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } else if(selected==\ con = 9; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } } //画笔大小if结束 else if(e.getSource()==EraserChoice) { //橡皮大小 String Esize = EraserChoice.getSelectedItem(); if(Esize==\ else if(Esize==\ else if(Esize==\ else if(Esize==\} } //下拉式列表响应方法结束 //鼠标拖曳事件响应方法 public void mouseDragged(MouseEvent e) { Point p1 ; switch(toolFlag){ case 0://画笔 x = (int)e.getX(); y = (int)e.getY(); p1 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p1); repaint(); break; case 1://橡皮 x = (int)e.getX(); y = (int)e.getY(); p1 = new Point(x, y, null, toolFlag, Econ); paintInfo.addElement(p1); repaint(); break; default : } } //鼠标拖曳事件响应方法结束 public void mouseMoved(MouseEvent e) {} //鼠标事件 public void update(Graphics g) { //刷新重绘 paint(g); } //鼠标press事件 public void mousePressed(MouseEvent e) { Point p2; switch(toolFlag) { case 3://直线 x = (int)e.getX(); y = (int)e.getY(); p2 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; case 4: //圆 x = (int)e.getX(); y = (int)e.getY(); p2 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; case 5: //矩形 x = (int)e.getX(); y = (int)e.getY(); p2 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; default : } } //鼠标press事件结束 //鼠标release事件:设置几何图元信息后调用paint() public void mouseReleased(MouseEvent e) { Point p3; switch(toolFlag) { case 0://画笔 paintInfo.addElement(cutflag); break; case 1: //eraser paintInfo.addElement(cutflag); break; case 3://直线 x = (int)e.getX(); y = (int)e.getY(); p3 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; case 4: //圆 x = (int)e.getX(); y = (int)e.getY(); p3 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; case 5: //矩形 x = (int)e.getX(); y = (int)e.getY(); p3 = new Point(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; default: } } //鼠标release事件结束 public void mouseEntered(MouseEvent e){} //实现鼠标事件接口 方法 public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} //命令按钮事件响应 public void actionPerformed(ActionEvent e) { if(e.getSource()==pen) //画笔 toolFlag = 0; if(e.getSource()==eraser) //橡皮 toolFlag = 1; if(e.getSource()==clear) { //清除 toolFlag = 2; paintInfo.removeAllElements(); repaint(); } if(e.getSource()==drLine) //画线 toolFlag = 3; if(e.getSource()==drCircle) //画圆 toolFlag = 4; if(e.getSource()==drRect) //画矩形 toolFlag = 5; if(e.getSource()==colchooser) { //调色板 Color newColor = JColorChooser.showDialog(this,\调色板 \ c = newColor; } 运行结果: 1、 使用画笔画图: 2、 画直线 3、 画圆 4、 画矩形 5、图片的保存 6、图片的打开 7、使用其画图画 8、显示调色板 实验体会: 这次实验主要是一个简单的绘图界面,他主要是涉及到了小菜单的绘制及功能的实现,工作区间的鼠标监听,菜单监听等的完美实现。 在本次实验中,我在网上查阅了大量资料,并根据其和老师所给的资料,让自己更加深刻的理解了java图形学的知识,更加明确了java绘图的实现途径。通过一次次的实验终于明白了本次实验的各个功能,让我了解了许多知识,也解释了自己在阅读程序时的一些困惑。绘图是将前几次知识点的一次小的结合,通过整合让我对计算机图形学有了更为清晰地认识,更加激发了我对于这块探索的兴趣,我相信在探索中我能更好的进步。 实验体会: 这次实验主要是一个简单的绘图界面,他主要是涉及到了小菜单的绘制及功能的实现,工作区间的鼠标监听,菜单监听等的完美实现。 在本次实验中,我在网上查阅了大量资料,并根据其和老师所给的资料,让自己更加深刻的理解了java图形学的知识,更加明确了java绘图的实现途径。通过一次次的实验终于明白了本次实验的各个功能,让我了解了许多知识,也解释了自己在阅读程序时的一些困惑。绘图是将前几次知识点的一次小的结合,通过整合让我对计算机图形学有了更为清晰地认识,更加激发了我对于这块探索的兴趣,我相信在探索中我能更好的进步。
正在阅读:
计算机图形学实验6实验报告06-08
什么人每天靠运气赚钱?02-07
学历教育硕士学位基本数据表03-20
宏观经济学试卷B 及答案04-19
文王六十四卦详析04-02
中控考勤软件问题 - 图文04-16
独自回家作文400字06-18
浙大新生学生手册考试试题及答案03-31
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 图形
- 计算机
- 报告
- 心理学选择题答案(1)
- (完整版)基于MATLAB的心音信号的采集和分析本科毕业设计
- 数据通信试题库-移动大比武
- 爱抖腿是病吗?是内心焦虑的体现
- 高考地理考点专练—光照图
- 自动控制原理教案-自控学习与解题指导
- 张湾乡财政资金监督管理办法
- 评弹开篇(选曲)精选
- 集结号-北京市临床医学专业副主任医师资格条件
- 2013入党积极分子培训测试题(cdut)
- 某学院同一首歌文艺晚会串词
- 基于防火墙技术对网络安全防护的认识
- 《面向对象程序设计C》期末试卷及标准答案(A)
- 中考方案设计型题专题讲座
- 机电工程学院2011年周末文化广场
- 《中级财务会计》习题集(总)
- 关于生态水利工程设计之我见
- 2018年全国大学生环保知识竞赛模拟题
- 基于PLC的校园照明智能控制系统设计
- 关于编制动漫产业基地项目可行性研究报告编制说明