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

下载本文档

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

文档简介

1、课程名称算机形学验项直裁剪 批改日期 一算法设计 (1) 整条直练窗口内。此时 不需剪裁,显示整条直线 (2) 整条直练窗口外,此时 不需剪裁,不显示整条直线 (3) 部分直线E窗口内,部分直线在窗口外。此时需要求出直线与窗框的交点,并将 窗口外的直线B分剪裁掉,显示窗口内的直i部分。 直剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删!在窗外的直线 然 后,那余直线逐条与窗框求交点,并将窗口外的部分删去。 以区域编码为础 将窗口及其周围勺8个方向以 4 bit的二邀数行码 如图24 所示的绸方法将窗口及其域分为个区域。 (1)内域:区域(0000。 (2) 上域:区域( (3) 下域:

2、区域 (4) 左域:区域 1001 1000 1010。 (0101, 0100, 01。10) (1001, 0001, 01Q1) 1001 l(XX) 1010 (XK)I (MKM) (K)IO 0101 0100 0110 窗口及其緘的5个区域及与直线勺关系 区域(1010, 0010, 01。10) “与”非零时线显不可见。某线的两各 端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右。算法的主要思 想是,每条直线如P1P2利用以下步骤进!判断: 直线端点 P1、P2别为(P1)= a, b e, d , C2(P2)= a b2 C2, c2其中, a、bi、c、

3、di 取值围1, 0, i 1, 2 1 如果ai=bi=Ci=di=0,则示整条直线取出下一条直线 返回步骤;否则入 步 如果 - 在“mylineView.cpp适当位置添加以下代码。 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 #define XL 100 #define XR 300 #define YT 100 #define YB 250 在On Draw中添加下列代码:以下的数据为所要生成直线的起点与终点 CPen newpen(PS_SOLID,1,RGB(255,0,0); CPen *old=p

4、DC-SelectObject( pDC-Rectangle(CRect(XL,YT,XR,YB);/ 剪切窗口 ptset0=CPoint(120,150); ptset1=CPoint(170,110); ptset2=CPoint(400,0); ptset3=CPoint(350,150); ptset4=CPoint(0,250); ptset5=CPoint(150,230); ptset6=CPoint(200,50); ptset7=CPoint(130,200); pDC-TextOut(0,0, 双击鼠标左键出现要裁剪的直线 ); 在添加的鼠标响应函数 OnLButtonD

5、blClk 里加入下列代码用来在双击鼠标左键时生成要裁剪的直 线 CDC* pDC=GetDC(); CPen newpen(PS_SOLID,1,RGB(255,0,0); CPen *old=pDC-SelectObject( for(int i=0;iMoveTo(ptseti); pDC-LineTo(ptseti+1); i+; pDC-SelectObject(old); 在实现裁剪的函数 On IDTRANSLATIO里添加下列代码,实现对上面的鼠标响应函数画出直线的裁剪 CDC* pDC=GetDC(); CPen newpen(PS_SOLID,1,RGB(255,0,0);

6、 CPen *old=pDC-SelectObject( float x,y; int i; int code1,code2; RedrawWindow(); / 求两端点所在区号 code for(i=0;iN;i+,i+) int c=0; if(ptseti.xXR)c=c|RIGHT; if(ptseti.yYB) c=c|BOTTOM; else if(ptseti.yYT) c=c|TOP; code1=c; c=0; if(ptseti+1.xXR) c=c|RIGHT; if(ptseti+1.yYB) c=c|BOTTOM; else if(ptseti+1.yMoveTo(

7、ptseti.x,ptseti.y); pDC-LineTo(ptseti+1.x,ptseti+1.y); if(code1=0 pDC-LineTo(ptseti+1.x,ptseti+1.y); if(code1=0 if(LEFT y=(float)ptseti.y+(ptseti+1.y-ptseti.y)*(XL-ptseti.x)/(ptseti+1.x -ptseti.x); else if(RIGHT y=(float)ptseti.y+(ptseti+1.y-ptseti.y)*(XR-ptseti.x)/(ptseti+1.x -ptseti.x); else if(BO

8、TTOM x=(float)ptseti.x+(ptseti+1.x-ptseti.x)*(YB-ptseti.y)/(ptseti+1.y -ptseti+1.y); else if(TOP x=(float)ptseti.x+(ptseti+1.x-ptseti.x)*(YT-ptseti.y)/(ptseti+1.y -ptseti.y); ptseti+1.x=(long)x; ptseti+1.y=(long)y; pDC-LineTo(ptseti+1.x,ptseti+1.y); if(code1!=0 精选 if(LEFT y=(float)ptseti.y+(ptseti+1

9、.y-ptseti.y)*(XL-ptseti.x)/(ptseti+1.x -ptseti.x); else if(RIGHT y=(float)ptseti.y+(ptseti+1.y-ptseti.y)*(XR-ptseti.x)/(ptseti+1.x -ptseti.x); else if(BOTTOM x=(float)ptseti.x+(ptseti+1.x-ptseti.x)*( YB-ptseti.y)/(ptseti+1.y -ptseti+1.y); else if(TOP x=(float)ptseti.x+(ptseti+1.x-ptseti.x)*( YT-ptseti.y)/(ptseti+1.y -ptseti.y); ptseti.x=(lo ng)x; ptseti.y=(lo ng)y; pDC-Li neTo(ptseti.x,ptseti.y); 运行函数,弹出程序窗口, 会发现弹出四条线段,位置 然后选择菜单里的裁剪命

温馨提示

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

评论

0/150

提交评论