计算机图形学实验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绘图的实现途径。通过一次次的实验终于明白了本次实验的各个功能,让我了解了许多知识,也解释了自己在阅读程序时的一些困惑。绘图是将前几次知识点的一次小的结合,通过整合让我对计算机图形学有了更为清晰地认识,更加激发了我对于这块探索的兴趣,我相信在探索中我能更好的进步。

本文来源:https://www.bwwdw.com/article/42t6.html

Top