版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学实验报告实验名称直线段裁剪姓名学号专业班级天津大学计算机科学与技术学院、实验目得熟练掌握Co hen Sutherland直线裁剪算法,并编程实现二、实验内容(1 )裁剪窗口为矩形窗口,且矩形边与坐标轴平行,长宽自己定。(2 )待裁剪线段端点坐标自己定;裁剪线段涵盖完全可见、不完全可见、 完全不可见类型。(3)要求显示待裁剪线段并用不同颜色标示出裁剪结果。实现方法:一般情况下,需要判断一条直线就是全部可见,全部不可见 , 部分裁剪(一段裁剪),全部裁剪(两端裁剪).通过把裁剪区域分成许多部分, 然后给每一段被裁剪得线段得两端分配一位代码,通过少量if语句与一个C ase语句就可以判
2、断出具体情况。C LI P CODES W 0? X000 5CTip rcidt匚】ip _-cn Je-QfDCKiBCl丄聞日日:IJELUjOihFCli.ji_cnJE_r%:Uz3ULhflip-w 帕-阳:DiiDlirif伪代码如下:#defi ne CL IP _CODE_O? x0000# de fineCLI P_CO DE_N0?xO 008# defi ne CLI P CCD E S0x0004# de f ine CLIP_COD E_EO x0 O 02#defin e CLI P _CODE_W0x0 O 01# d e fineCLI P _COD E._N
3、 E ? O x000a#de f ineC LIP_CODE_SE)? X000 6#de f ineC L I P_CDDE _NW 0? xO 009#defi ne实验步骤:1)生成裁剪窗口,窗口由直线 xl=250 , xr = 8 5O ,yb=250 , yt=4502)绘制直线段3)编写Cohen Su the r la n d直线裁剪算法,对直线段进行裁剪编码定义规则:第一位C1:若端点位于窗口之左侧,即Xvxl,贝U C仁1,否则 C 1 = 0o第二位C2 :若端点位于窗口之右侧,即Xxr,贝U C2=l ,否则 C2=0。第三位C3:若端点位于窗口之下侧,即Yyb,贝U
4、 C3=1,否则 C3=0o第四位C4:若端点位于窗口之上侧,即Y y t ,则 C4 = 1,否则 C4=0.裁剪步骤:对所有直线得端点都建立了区域码之后,就可按区域码判断直线在窗口 之内或窗口之外。这可分为如下几种情况:若一直线得两个端点得区域码均为0000则此直线在窗口边界之内,应子保留。若一直线得两个端点得区域码得同一位同时为1,则此直线全部在窗口边界之外,应子裁剪。例如,若一直线得一个端点得区域码为 1001,另一个 端点得区域码为0101,则此两端点得区域码得第一位均为l ,说明此两端点 均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。可用将直线两 个端点得区域码进行与操作得
5、方法,判断直线就是否在窗口之外,若与操作 得结果为0000则两端点得区域码任何位均不同时为l此直线不一定被裁剪。以上两种情况之外得直线,有可能穿过窗口,也有可能不穿过窗口下图中所示得两条直线都不符合情况得要求 ,但一条直线(P 1P2)穿过 窗口,另一直线(P 3 P4 )不穿过窗口。对这类直线可以进行如下处理:取窗 口外得一个端点与窗口边界比较以确定可排除直线得哪一部分,然后,把直 线剩下得部分与其她边界比较,这样一直到直线全部被排除或确定直线得哪 一部分在窗口之内为止。可按“左、右、下、上”得次序建立检查直线端点 与窗口边界关系得算法。P2P3-P4图、实验结果画线效果一:画线效果二:其她
6、效果用户可自行绘制四、实验分析与总结掌握了 o penG L得基本用法,掌握了 Co henSut herlan d直线裁剪算 法,并编程实现出来、五、源代码v o id C CsL in eVi e w:Co h en() / / Cohen -S u therla nd 算法? BO 0L Change;? d OUbl e X , y ;RC0=En Co de ( P o i ntx 0 , Poin t y 0);RCl =EnC od e( Poin t x 1,Pointy 1);? w hil e ( T RUE )Ch ange= FALSE(0 = ( R C0| R C1
7、)? ? /简取之ret urn;els e i f( O !=(RC0 &RC 1)? / 简弃之re t urn;? ? elsei f(O=RCO ) /如果PO点在窗口内,交换 PO与P 1,保证pO点在窗口外?/ 交换点得坐标值do uble T Po in t x,T Po i nty;? TPoi ntx=Po i nt x O : ; TPo in t y=Pointy O ;? Poi n tx O =Point x 1; Poi nt y O =Pointy ? ? Poin tx 1 =TPoin t x;Poi n t y 1=TPoin ty;? / /交换点得编码值
8、un signe d intT RC ;? TR C=R CO ; R CO =RC1;RC1=T RC? ? ? /按左、右、下、上得顺序裁剪?it x 1:f(RCO & LEF T )/PO 点位于窗口得左侧? x=wxl; /求交点 y ? y=PointyO : +(Poi nt y1P oi ntyO) (xP oint xO)/(Po i n -Po int x O ) ;? P oint x O =x; P oi n tyO =y;C han g e=TRUE ;? ?R CO =E nCode (P oi nt x 0, P oin t y 0 ); RC1=E nCode
9、(P oin tx 1,Pointy 1);? ? if ( RCO & R I GHT )/P 0点位于窗口得右侧? ? x=w xr; /求交点 y?y= P o i nty 0 ( P oint0)/(Pointx 1: -Po intx0) ;y 1 卜P o int y 0 ) * ( X PointPo int X 0= X; Pointy0 :? ? Cha nge=TRUE;? ? RC0=EiC o d e(Poin t x0,Poi ntyO ); RCl =EnCode(Point x 1 , Pointy 1 );? ? ? if(RC0 & BOTT OM )/P0点
10、位于窗口得下侧?y = wyb;/求交点-Pointyx= P ointx 0 +(Po intx1 Pointx0) ( y -Poi nt y0 )/(Pointy10 ) ;Poin t x0 =X; Pointy0=y;? Ch an g e=TRLE;RC0=EnC ode(Po i ntx0, Po in t y 0 );RC1 = EnCode (PointxPointy 1) ;?i f (R C 0 & TOP )/P0 点位于窗口得上侧y =wyt ;/ 求交点 x? ? ? ? x= Pointx 0:+ (Poin t x 1 卜P o i n tx0 :) * (y
11、P ointy0)/( Po ity1 Po intyO);? Po intx 0= x ;Poin ty 0 =y;Change= TR UERC 0=EnC ode (Po1 ntx0,P o inty0 ) ; RC1=EnCoed ( P oin t x1 ,Pointy1)if(FALSE= =Change )return;?VO 1C C s L ine V iew: : On Draw(C D C* p D C)CRec t R ect;G etClie n tRect (&R ect);/ /获得客户区得大小C Bi t map B itm a p, pB itmap ;i t
12、map、LoadBit ma p (IDB_BITMAP 1);CDCMem DC;? Mem DC C r e a t epatibleD C( GetDC();? pB 1 tmap= MemDC Se le ctOb j ec t (&Bit m a p);? M emDC BitBlt(O,O, R e c t、W id R CCOP Y);t h (), Rec t、H ei g ht() ,& Pi c ture , 0, 0,S? M emDC、Tex tOu t ( wx l+wxr) 2, wy b-20 ,窗口 ) ;/ 窗口标题/ 绘制窗口与直线? p Old P en
13、3M emDC、? MenDC、 LineT o(wxr,wy b ) ; M em DC L i ne To (wxl ,wy b);M emD C、Li ne To( wxl,w y t) ;M emDC、SelectObject(p OldPen 3);Pe n3、 Del eteO bj ec t();CPen Pen 1,* p Ol d Pen 1;/定义1个像素宽度得画笔Pe n1 、 Create Pe n ( PS_SOLID,2 ,RGB(2 5 5,0,0 );? pOld Pen 仁MemCS ele ctO b j ect& Pen1);if( m_ i = 1)?
14、? MemDCMov eToR OUNDP( oint x0 : ),RO U ND(P oint y 0 ) );? MemD C、 LineTo(ROUD ( Poi ntx1 : ),R OUN D (Poin t y : 1) ); ? ?M em DC、 Se l e ctO bject ( pOldP en1);CPe n Pe n 3 ,*p O Id P en3;/定义3个像素宽度得画笔 ? Pe n 3、C re at ePe n(P S_SO LI D, 2 , R GB(0, 0, 0 );=M emDCS ele ct Obje c t( & Pen 3);Mo veT
15、o(w xl ,wyt ) ;M emDC L i neT o (wxr, wyt);Pe n1、 Delet eObjec t (); ? CD C *d c =GetDC( ) ;? dc B i tB l t (0, 0, R ect、Wid th( ) ,Re c t、Hei ght () , &Me mDC ,0, 0 ,S R CCO PY); ? Me mDC、S elect Objec t(pB i tmap );voi d CCsLi n eView: : On d r a w line () / 屏幕画线函数i f (FALSE=m_A tt a tch)? ? Pictu
16、re、 Createpa t ibleDC(G et DC();? CBitm ap? B itmap,*p B itm a p;Bi tmap = new CBi t map;? Bi t map-LoadBitma p (I DB _BITMAPI);? p Bitma p =Pi c t u re、Selec t Object (Bit map);? m_Att a tch =T RUE;m_D r a w=TRUE;? m_i=0;? Inv al idate(F A L S E);? AfxG e tMai n Wnd()-Set W in d owText (C o hen Sut
17、herland 直线裁剪算法);/ 显示 标题, ”提MessageBox (请使用鼠标在屏幕上绘制直线,然后点击裁剪按钮进行裁剪”示,MB_OKCANEL); ?d CCsLineV i ew : O nMouseM ov e (UI NT nFlag s , CPo动函数voint p o int) 鼠标移/ TO DO : Add you r me ss a ge h andler c o de herea nd /or call d e faultif(TRUE =m _Draw)?if(m _i 2)?Poi n txm_i= p o i nt、x; P oint y m_i =po i nt、Inva
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论