实验一 编程实现直线段的裁剪算法_第1页
实验一 编程实现直线段的裁剪算法_第2页
实验一 编程实现直线段的裁剪算法_第3页
实验一 编程实现直线段的裁剪算法_第4页
实验一 编程实现直线段的裁剪算法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、实验一编程实现直线段的裁剪算法课程名称:图形学任课老师谢伙牛老师年级03级班级计算机(6)班姓名沈睿汀学号S030300833明倏博£孝调&去1、 实验要求1、 裁剪算法选用Cohen-Sutherland算法;2、 界面设计友好、直观。2、 实验环境说明(1)本系统基于JAVA编程环境,使用JBuilderX作为相关的开发工具,因此系统的运行与其它用VC+开发的系统略有不同。(2) 在WINDOWS-XP下运行本程序的时候,请先安装j2re-1_4_2_04-windows-i586-p.exe,然后,才能正常运行,windows环境下双击030300833Cutline.

2、exe。3、 算法与数据结构(程序设计)核心算法Cohen-Sutherland的编写过程如下(在Sutherland.java文件中可以看到具体代码):(1)新建一个类Sutherland,并在类在声明一个构造函数Sutherland(intwyt,intwyb,intwxl,intwxr),传递矩形的四个边界参数,并对类中的共有属性进行初始化。(2)声明一个端点编码方法privatevoidcodingPoint(intx,inty,intp),根据书上的编码规则对端点进行编码。(3)声明一个方法publicvoidsetPoint(intx1,inty1,intx2,inty2)来设置直

3、线段的两端点坐标。(4)声明两个方法privateintOR(intop1,intop2)和privateintAND(intop1,int口op2)来分别实现编码后的端点的相或和相与。并编写一个方法isInWindow(intop)来判断点op是否在窗口中。(5)编写两个方法privateintcaculateY(intx1,inty1,intx2,inty2,intx)和privateintcaculateX(intx1,inty1,intx2,inty2,inty)来分别求出未知的端点坐标,接着利用这两个方法又编写一个方法privatevoidcaculateCrossPoint(来对直

4、线段和相应的窗口边界进行求交处理。(6)最后是利用上面编写的各个方法来编写主代码publicvoidcutLine(),实现直线段的裁剪。(7)核心主代码如下所示:/裁剪算法publicvoidcutLine()inttemp=0;while(true)codingPoint();/对直线端点进行编码if(OR(p1,p2)=0)判断p1|p2是否等于0out_x1=x1;out_y1=y1;out_x2=x2;out_y2=y2;break;elseif(AND(p1,p2)=1)/判断p1&p2是否等于1out_x1=0;out_y1=0;out_x2=0;out_y2=0;bre

5、ak;elseif(AND(p1,p2)=0)/判断p1&p2是否等于0if(isInWindow(pl)=0)/p1点是否在窗口里面,0表示在窗口里面temp=x1;x1=x2;x2=temp;temp=y1;y1=y2;y2=temp;codingPoint();/重新对端点进行编码caculateCrossPoint()/求交四、实现功能说明(包括操作说明)备欢迎使用畤utK”工皿国法进行直线殿的载翦绘国区画短拶画直璃裁其喑廨如上图所示,该软件有四个按钮和一个绘图区。(1)用户可以先点击“画矩形”按钮,然后在绘图区按住鼠标并拖动,便能绘制出一个用户想要的矩形。(2)点击“画直线”

6、按钮,然后在绘图区的任意两个位置分别用鼠标点击一下(即确定直线的两个端点),便可以绘制出一条用户想要的直线。(3)点击“裁剪”按钮,便执行裁剪算法,即进行直线段的裁剪,并会把裁剪的最终结果以图形的形式反映在绘图区上。(4)点击“清屏”按钮,可实现屏幕的清屏,方便用户重新绘制矩形和直线段。下面是对某个例子的演示(1)分别点击按钮“画矩形”和“画直线”,然后绘制出如图1所示的图形图1(2)点击“裁剪”按钮,便可执行出如图2所示的裁剪结果图2四、实验心得做本实验的第一步当然是语言的选择,我是选择了JAVA语言来完成本实验的编程实现。接着,在大概熟悉了JAVA语言的编程方法后,便开始着手于实验的代码实

7、现。在把Cohen-Sutherland算法流程搞清楚后,便根据书上的步骤一步步编下来。根据书本的步骤编写Cohen-Sutherland算法,感觉思路很清晰,就是把代码模块化,尽量一个方法里面的代码行数不要超过30行。这也方便以后的维护和修改。当怎么来验证我这个算法的编写是否正确呢?简单的输入几个参数值,再看输出结果,显然不够直观。所以,便参阅了一些JAVA编程的书籍,比如JAVA语言与面向对象程序设计一清华大学出版社,JAVA参考大全之类的书籍。主要是看图形绘制部分和响应鼠标事件的代码实现。例题代码看懂了,以为模仿一下就可以实现我的实验目的了。但是,事情却未能一蹴而就。(1)鼠标位置的定位

8、问题,这个问题我花了两个下午加一个晚上才解决掉。我是在容器contentPane里面添加了一个容器jPanel_Graphics,并打算把jPanel_Graphics当作我的绘图区,问题就这么出现了:每次我在位置A点击鼠标,可画出的点却是在位置B,不管怎么修改代码,就是不能实现鼠标的准确定位,我的一个同学也是用JAVA编程的,但他是新建JAVAAPPLET程序(我是新建JAVAAPPLICATION程序),他不会出现我的这个见鬼的问题。反正就是折腾了好久,还上网查了很多相关的资料,但就是没看到有用的信息。后来,我只好试着人为在代码里面修改画点的位置,就是准备画的点的X坐标=从鼠标点击事件得到

9、的e.getX()+4,Y坐标=从鼠标点击事件得到的e.getY()+31,4和31是我慢满调试出来的,从视觉效果上看,基本实现了鼠标的准确定位。这个问题真的是让我郁闷了好久,刚开始还以为实验做不下去了,因为如果你连鼠标的准确定位都实现不了,接下去的画矩形和把裁剪结果用图形的方式显示出来,根本就无从谈起!( 2)鼠标位置的定位问题解决了,接着是怎么来保存我画的直线的端点,显然,用数组是不行,因为你无法预知究竟用户会画几条直线。最后找到了一个库中本来就支持的Point类和Vector类。用它来记录端点坐标。( 3)至于拖动鼠标画出矩形,是参考了JAVA完美经典江义华,林彩榆,没什么大问题出现。(

10、 4)又一个严峻问题出现了,那就是屏幕的清屏(刷新)。我同学是利用画一个跟屏幕背景一样颜色的矩形来实现清屏的,我总觉得不是很好,后来,真的是偶然,发现了super.update(哒个方法,简单的调用一下这个方法,便很好的实现了清屏目的。( 6)在搞定了这些大大小小的问题后,我便调用我刚开始写的那个Cohen-Sutherland算法,看看是否正确。运行了一下,无法实现裁剪。由于JBuilderX这个环境我还不知道如何进行单步调试,所以只好利用System.out.println()这个方法输出一些中间结果来判断是哪里出错。也是调试了好久,最后才找到病原,其实,这个病原并不大,就是课本提供的对端点的编码规则那里,是把原点定在左下角,但是,正如我们大家都知道,却容易忽视的显示屏幕的原点是位于左上角的!就是这个问题,影响了我结果的正确输出。( 7)修改了相关的代码后,裁剪结果正确显示输出了,这确实令人为之振奋。但当我点击清屏按钮,重新画直线时,编译环境发出警告提示我NullPointerException,真是一波三折,真是快崩溃了,又出什么问题了?经过仔细的检查后,才发现是Vector类出问题了,执行向Vcotr增加元素和删除元素操作时,没把握好指针位置。以上,大概就是我

温馨提示

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

评论

0/150

提交评论