《计算机图形学》实验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) {