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();

}