计算机图形学实验报告6._第1页
计算机图形学实验报告6._第2页
计算机图形学实验报告6._第3页
计算机图形学实验报告6._第4页
计算机图形学实验报告6._第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学实验6实验报告实验题目: 简单Java绘图板程序实验内容:1 阅读理解本试验提供的参考资料。2编写并调通一个简单绘图板的java程序。参考资料:1 pb.java 2 Java图形处理介绍.doc基本概念:1在编写显示图形的JAVA程序中,需要经常覆盖一些方法,其中使用的最多的就是paint()、repaint()和update()方法。 Paint() :每次applet被其他窗口覆盖后重新显示时,都会调用paint()方法,在paint()方法中会调用repaint()方法; Repaint(): repaint()方法强制Applet进行重新绘制。调用repaint()方法之

2、后会接着调用update()方法。Repaint()方法有三种调用方式:l public void repaint(long tm)功能:每隔tm毫秒进行重绘;l public void repaint(int x, int y, int width, int height)功能:重绘由参数指定的矩形区域;l public void repaint(long tm, int x, int y, int width, int height)功能:每隔tm毫秒对指定矩形区域进行重绘;Update() :update()方法默认的行为是先使用背景色填充applet,然后再调用paint() 方法2

3、颜色模型绘制图形的过程就是布置布置颜色的过程,为了将二进制数字变成屏幕颜色,需要采用一些规则,Java把这个规则包装在颜色模型中。 Java的32位颜色模型Java将颜色表示为32位。在缺省情况下,用于表示图形的32位数中8位用于alpha,8位用于红,8位用于绿,8位用于蓝。这些值恰好放进一个32位的int数中。 ColorModel类(在java.awt.image包中)有两个子类,包装了两大颜色模型:l DirectColorModel支持将32位整型数分配成用不同位数和位的位置用以表示alpha、红、绿、蓝。l IndexColorModel支持查找表。颜色表示成字节,用于对表索引。真

4、实颜色值是表中的整型数,用缺省颜色模型进行翻译。直接颜色模型(DirectColorModel)直接颜色模型在程序中指定整型数中的多少位和哪些位分别用于表示alpaha、红、绿、蓝四个属性。在这里必须注意的是,在直接颜色模型中,每一个属性的位必须连接,且不能与另一个属性的位重叠。DirectColorModel类有两个构造器,都要求用一个整数指定模型的位宽(当前模型用32位,旧式颜色模型用8位)。每种颜色(红、绿、蓝)用一个整数,也可以用第五个整数指定alpha。l DirectColorModel(int nbits,int redmask,int greenmask,int,bluemas

5、k)l DirectColorModel(int nbits,int redmask,int greenmask,int bluemask,int alphamask)掩膜就是将整数中对应颜色所在位进行设置的整数。例如,用1位表示红色、3位表示绿色、20位表示蓝色的颜色模型构造如下:model=new DirectColorModel(32,0x800000,0x700000,0x0fffff); 索引颜色模型(IndexColorModel)ColorModel类的另一个颜色模型是索引颜色模型IndexColorModel。索引颜色模型把颜色值看成红、绿、蓝数值查找表中的索引,在Java中索

6、引是个字节。实际要查找3个表,各对应一个主颜色(另外,你还可以用第4个表查找ALPHA)。每个表项包含8位,用于指定颜色强度。对于使用较少颜色的图形,索引颜色模型通过了方便的映射机制,这个机制特别适用于图形要构造成数字信息时。索引颜色模型也可以用于绘制不规则形状。IndexColorModel类的构造器有很多过载,最简单的形式是:IndexColorModel(int nBits,int nColors,byte reds,byte greens,byte blues)索引颜色模型的主要好处是包装了查找过程,另一个附带效果是只用8位而不是32位表示图素。这就节省了75,这在程序使用几个大图形时

7、效果会很明显。还有一个好处是加强了图形过滤性能。3图象的装入 在Java中Image是一个抽象类,是无法构造的。创建图形时,使用Component类中的CreateImage方法,这种方法通常只是让它的同级件建立图形。在特定平台上对本地方法的一组调用成为同级件。使用CreateImage()主要是对本地方法的调用,通过这种调用,返回的对象是Image的特定平台子类。图形也可以通过Component类的getImage方法从远程文件装入。远程装载最简单的办法是直接使用getImage连接拥有远程图形文件的机器,装入文件、分析文件、构造并返回图形。在实际中,Java对远程图形文件都执行下列策略:所

8、有远程图形都使用异步线程装入。图形需要使用或“观察”(Observe)时才开始装入线程。这是因为直接装载会引起很大的延迟。4 imageUpdate的标志值标志含义l ImageObserver.WIDTH 图形宽度已经修改,可以从width参数读或用图形的getwidth()方法读取 l ImageObserver.HEIGHT 图形高度已经修改,可以从height参数读或用图形的getHeight()方法读取l ImageObserver.PROPERTIES 图形属性已经修改,可以用图形的Getproperties()方法读取l ImageObserver.SOMEBITS 图形的多个图

9、素已经传送l ImageObserver.FRAMEBITS 多帧图形的一个帧已经传送l ImageObserver.ALLBITS 整个图形已经完毕l ImageObserver.ERROR 生成中出现了错误l ImageObserver.ABORT 生成异常终止5内存图象源(MemoryImageSource)在Java中另一种图形源是内存:你可以在程序中建立整形或字节数组来表示图素值,并利用Java的MemoryImageSource类构造Image的实例。 MemoryImageSource的构造器调用如下:MemoryImageSource(int width, int height

10、, int pixels, int arrayOffset, int scanwidth) MemoryImageSource有各种表示颜色的选项。MemoryImageSource最简单的输入形式是整型数组,正如我们在前面颜色模型中提到的一样,每个整型数用8位(0-7位)表示蓝色,8位(8-15位)表示绿色,8位(16-23位)表示红色,最显著的8位(24-31位)表示颜色的alpha或不透明度。一般的系统处理无法访问的透明度组合时用绘制无法访问的颜色所用的办法:配色(dithering),这是因为真正的不透明度需要十分昂贵的硬件设备。 如果MemoryImageSource的整型数组使用的

11、是二维数组,处理出来将会比较容易,但这里的整型数组是一维的。图素值表示如下:对于n列图形,前n列表示第一个扫描行;第二n列表示第二个扫描行,等等。数组排版之后,内存图形源可以从整个数组或部分数组构造。MemoryImageSource构造器要传入所要图性的尺寸,int数组,数组偏离量和int数组表示的假象图形宽度。最后一个参数用于所要图形是假想整图的子集时。6图象生成器、使用者和过滤器(ImageProducer、ImagerConsumer & ImageFileter) 将远程gif文件变成图素值的隐藏对象和相当直观的内存图形源都是图形生成器。它们实现java.awt.image包

12、中的ImageProducer接口。图形生成器的任务是将图素值传递给图形使用者。Java.awt.image包中除了ImageProducer外,还有个ImageConsumer接口。图形的建立是生成器和使用者之间对话的结果。生成器/使用者对话是由使用者启动的,使用者告诉生成器开始生成。生成器作出的响应是报告图形的长度(如果可能),然后开始计算图素值(或开始从远程服务器文件取用)。生成器随时向使用者发送新图素并告诉使用者任务何时完成。ImageProcuder和ImageConsumer两个接口比较复杂。ImageProducer具有允许多个使用者向生成器登记的方法。ImageConsumer

13、也有允许生成器提供更多关于图形和生成器信息的方法。 ImageFileterAWT通过允许你在图象生成者和图象使用者之间插入图象过滤器的方式支持对图象的操作。一个图象过滤器实际上就是一个ImageFilter类,它放置在一个生产者和一个使用者之间,在使用者得到图象之前改变图象的数据。过滤器子类第一子类叫CropImageFilter。构造器接受x、y、width和height。过滤器取出这些参数指定的图形子集。第二个子类是RGBImageFilter。这是个抽象类,其抽象方法FilterRGB(int x、int y、int rgb)应由子类改写。X和y参数是过滤的图素坐标 ,rgb是要转换的

14、图素值。注意rgb表示成缺省颜色模型(alpha:红、绿、蓝)。这种方法应返回表示新转变的图素值的int。通常RGBImageFilter生成子类生成上下文无关的过滤器,即rgb转换算法与转换图素位置和其它图素值无关的过滤器。算法设计:1定义点类class Point implements Serializable int x,y; Color col; int tool; int boarder; Point(int x, int y, Color col, int tool, int boarder) this.x = x; this.y = y; this.col = col; this

15、.tool = tool; /不同绘图工具this.boarder = boarder; 2定义绘图板类 paintboardPaintboard类继承Frame类,用于实现画图板的总体构架。包括菜单栏设计,工具栏设计,画图区创建,鼠标事件等。 构造方法paintboard(String s) super(s);addMouseMotionListener(this); addMouseListener(this); paintInfo = new Vector(); /几何图元信息/*各工具按钮及选择项*/ /颜色选择 ColChoice = new Choice(); ColChoice.

16、add("black"); ColChoice.add("red"); ColChoice.add("blue"); ColChoice.add("green"); ColChoice.addItemListener(this); /画笔大小选择 SizeChoice = new Choice(); SizeChoice.add("1"); SizeChoice.add("3"); SizeChoice.add("5"); SizeChoice.add(&

17、quot;7"); SizeChoice.add("9"); SizeChoice.addItemListener(this); /橡皮大小选择 EraserChoice = new Choice(); EraserChoice.add("5"); EraserChoice.add("9"); EraserChoice.add("13"); EraserChoice.add("17"); EraserChoice.addItemListener(this); toolPanel = n

18、ew 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

19、("保存图画"); colchooser = new Button("显示调色板"); /各组件事件监听 clear.addActionListener(this); eraser.addActionListener(this); pen.addActionListener(this); drLine.addActionListener(this); drCircle.addActionListener(this); drRect.addActionListener(this); openPic.addActionListener(this); save

20、Pic.addActionListener(this); colchooser.addActionListener(this); /标签颜色 = new Label("画笔颜色",Label.CENTER); 大小B = new Label("画笔大小",Label.CENTER); 大小E = new Label("橡皮大小",Label.CENTER); /面板添加组件 toolPanel.add(openPic); toolPanel.add(savePic); toolPanel.add(pen); toolPanel.add

21、(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,

22、BorderLayout.NORTH); setBounds(60,60,900,600); setVisible(true); validate();/强制显示容器/dialog for save and load openPicture = new FileDialog(this,"打开图画",FileDialog.LOAD); openPicture.setVisible(false); savePicture = new FileDialog(this,"保存图画",FileDialog.SAVE); savePicture.setVisible

23、(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 WindowAd

24、apter() 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<n ;i+) p1 = (Point)paintInfo.e

25、lementAt(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, p2.x, p2.y); g2d.draw(line1); brea

26、k; 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, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y); g2d.draw(ellipse); break; cas

27、e 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()代码: /定义点类class Point implements Serializable int x,y; Color col; int tool; int boarder; P

28、oint(int x, int y, Color col, int tool, int boarder) this.x = x; this.y = y; this.col = col; this.tool = tool; /不同绘图工具this.boarder = boarder; /点类定义结束/定义绘图板类 paintboard,带事件监听class paintboard extends Frame implements ActionListener,MouseMotionListener,MouseListener,ItemListener int x = -1, y = -1; int

29、 con = 1;/画笔大小 int Econ = 5;/橡皮大小 int toolFlag = 0;/toolFlag:工具标记 /toolFlag工具对应表: /(0-画笔);(1-橡皮);(2-清除); /(3-直线);(4-圆);(5-矩形); Color c = new Color(0,0,0); /画笔颜色 BasicStroke size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);/画笔粗细 Point cutflag = new Point(-1, -1, c, 6, con);/截断标

30、志 Vector paintInfo = null;/点信息向量组 (几何图元信息)int n = 1; FileInputStream picIn = null;/文件流保存、读入所画图形FileOutputStream picOut = null; ObjectInputStream VIn = null; ObjectOutputStream VOut = null; / *工具面板-画笔,直线,圆,矩形,多边形,橡皮,清除*/ Panel toolPanel; Button eraser, drLine,drCircle,drRect; Button clear ,pen; Choic

31、e ColChoice,SizeChoice,EraserChoice; Button colchooser; Label 颜色,大小B,大小E; Button openPic,savePic; FileDialog openPicture,savePicture; /文件名会话框/构造方法paintboard(String s) super(s);addMouseMotionListener(this); addMouseListener(this); paintInfo = new Vector(); /几何图元信息/*各工具按钮及选择项*/ /颜色选择 ColChoice = new C

32、hoice(); ColChoice.add("black"); ColChoice.add("red"); ColChoice.add("blue"); ColChoice.add("green"); ColChoice.addItemListener(this); /画笔大小选择 SizeChoice = new Choice(); SizeChoice.add("1"); SizeChoice.add("3"); SizeChoice.add("5"

33、); SizeChoice.add("7"); SizeChoice.add("9"); SizeChoice.addItemListener(this); /橡皮大小选择 EraserChoice = new Choice(); EraserChoice.add("5"); EraserChoice.add("9"); EraserChoice.add("13"); EraserChoice.add("17"); EraserChoice.addItemListener(t

34、his); toolPanel = new Panel(); /命令按钮clear = new Button("清除"); eraser = new Button("橡皮"); pen = new Button("画笔"); drLine = new Button("画直线"); drCircle = new Button("画圆形"); drRect = new Button("画矩形"); openPic = new Button("打开图画"); s

35、avePic = new Button("保存图画"); colchooser = new Button("显示调色板"); /各组件事件监听 clear.addActionListener(this); eraser.addActionListener(this); pen.addActionListener(this); drLine.addActionListener(this); drCircle.addActionListener(this); drRect.addActionListener(this); openPic.addActionL

36、istener(this); savePic.addActionListener(this); colchooser.addActionListener(this); /标签颜色 = new Label("画笔颜色",Label.CENTER); 大小B = new Label("画笔大小",Label.CENTER); 大小E = new Label("橡皮大小",Label.CENTER); /面板添加组件 toolPanel.add(openPic); toolPanel.add(savePic); toolPanel.add(

37、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); /工具面板到APPL

38、ET面板 add(toolPanel,BorderLayout.NORTH); setBounds(60,60,900,600); setVisible(true); validate();/强制显示容器/dialog for save and load openPicture = new FileDialog(this,"打开图画",FileDialog.LOAD); openPicture.setVisible(false); savePicture = new FileDialog(this,"保存图画",FileDialog.SAVE); sav

39、ePicture.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); ); addWindowLi

40、stener(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<n ;

41、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, p2.x, p

42、2.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, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y); g2

43、d.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.getSo

44、urce()=ColChoice) /预选颜色 String name = ColChoice.getSelectedItem(); if(name="black") c = new Color(0,0,0); else if(name="red") c = new Color(255,0,0); else if(name="green") c = new Color(0,255,0); else if(name="blue") c = new Color(0,0,255); else if(e.getSource

45、()=SizeChoice) /画笔大小 String selected = SizeChoice.getSelectedItem(); if(selected="1") con = 1; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); else if(selected="3") con = 3; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); else if(

46、selected="5") con = 5; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); else if(selected="7") con = 7; size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); else if(selected="9") con = 9; size = new BasicStroke(con,BasicStroke.

47、CAP_BUTT,BasicStroke.JOIN_BEVEL); /画笔大小if结束else if(e.getSource()=EraserChoice) /橡皮大小 String Esize = EraserChoice.getSelectedItem(); if(Esize="5") Econ = 5*2; else if(Esize="9") Econ = 9*2; else if(Esize="13") Econ = 13*2; else if(Esize="17") Econ = 17*3; /下拉式列

48、表响应方法结束/鼠标拖曳事件响应方法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, toolFl

49、ag, 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

50、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)

51、; 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

52、, 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论