2024年4月11日发(作者:)
实 验 报 告
课程名称
姓 名
实验名称
班级
学号
直线段裁剪
实验日期
实验成绩
太原工业学院
实
验
目
的
实
验
环
境
使用Cohen_Sutherland裁剪算法裁剪直线段。
Visual Studio 2010
基本要求:
实
验
内
容
1. 掌握Cohen_Sutherland裁剪算法原理;
2. 在屏幕上固定绘制矩形代表窗口,使用鼠标绘制任意直线段
(Bresenham算法实现),使用裁剪按钮裁剪直线段,去掉窗口外的部分;
实验拓展:在屏幕上显示一个直线构成的图案,使用鼠标选择两点绘
制矩形代表窗口对图案矩形裁剪。
实验基本原理:
Cohen-Sutherland直线段裁剪算法是最早流行的编码算法。每段直线
的端点都被赋予一组四位二进制代码,称为区域编码(region code,RC),
用来标识直线段端点相对于窗口边界及其延长线的位置。
假设窗口是标准矩形,由上、下、左、右4条边界组成,延长窗口的
实
验
步
骤
4条边界形成9个区域。这样根据直线段的任一端点P(x,y)所处的窗口区
域位置,可以赋予一组4位二进制编码,称为区域码RC=C3C2C1C0。C0代
表左边界, C1代表右边界, C2代表下边界, C3代表上边界。
为了保证窗口内及窗口边界上直线段端点的编码为零,定义规则如下:
C0:若端点的x C1:若端点的x>wxr,则C1=1,否则C1=0。 C2:若端点的y C3:若端点的y>wyt,则C3=1,否则C3=0。 核心代码: (1)双缓冲 void CTestView::DoubleBuffer(CDC *pDC)//双缓冲 { CRect rect;//定义客户区 GetClientRect(&rect);//获得客户区的大小 pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系 pDC->SetWindowExt((),());//设置窗口范围 pDC->SetViewportExt((),-());//设置视区范围,x轴水 平向右,y轴垂直向上 pDC->SetViewportOrg(()/2,()/2);//客户区中心为原 点 CDC memDC;//内存DC CBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图 CompatibleDC(pDC);//创建一个与显示pDC兼容的内存 memDC CompatibleBitmap(pDC,(),());//创 建兼容位图 pOldBitmap=Object(&NewBitmap);//将兼容位图选入 memDC lidRect(rect,pDC->GetBkColor());//按原来背景填充客户 区,否则是黑色 Mode(MM_ANISOTROPIC);//memDC自定义坐标系 dowExt((),()); wportExt((),-()); wportOrg(()/2,()/2); Rect(-()/2,-()/2); DrawWindowRect(&memDC);//绘制窗口 if(PtCount>=1) { (Round(P[0].x),Round(P[0].y)); (Round(P[1].x),Round(P[1].y)); } pDC->BitBlt(,,(),(),&memDC,- ()/2,-()/2,SRCCOPY);//将内存memDC中的位图拷贝到 显示pDC中 Object(pOldBitmap);//恢复位图 Object();//删除位图 } (2)绘制裁剪窗口 void CTestView::DrawWindowRect(CDC* pDC)//绘制裁剪窗口 { // TODO: Add your message handler code here and/or call default pDC->SetTextColor(RGB(128,0,255)); pDC->TextOut(-10,Wyt+20,CString("窗口")); CPen NewPen3,*pOldPen3;//定义3个像素宽度的画笔 Pen(PS_SOLID,3,RGB(255,128,0)); pOldPen3=pDC->SelectObject(&NewPen3); pDC->Rectangle(Wxl,Wyt,Wxr,Wyb); pDC->SelectObject(pOldPen3); Object(); }
发布评论