实验目的:

  1. 理解裁剪的作用
  2. 掌握直线裁剪的算法
    实验内容:
    一、编写程序实现Cohen Sutherland裁剪算法
    算法原理:
    首先判断直线段是否全部在窗口内,是,则保留;不是,则再判断是否完全在窗口之外,如是,则舍弃。
    如果这两种情况都不属于,则将此直线段从交点处分割,对分割后的线段再进行如前判断。
    直至所有直线段和由直线段分割出来的子线段都已经确定了是保留还是舍弃为止。
    算法流程:
  3. 对直线的两个端点进行编码
    编码方式
    注意:l为left,r为right,b为bottom,t为top
    (1)若x小于wxl,D0=1,否则D0=0 C1 | 0001 按位或
    (2)若x大于wxr,D1=1,否则D1=0 C1 | 0010
    (3)若y小于wyb,D2=1,否则D2=0 C1 | 0100
    (4)若y大于wyt,D3=1,否则D3=0 C1 | 1000
  4. 进行区域测试
    如果code1和code2均为0,code1按位或code2,则说明P1和P2均在窗口内,那么线段全部位于窗口内部,应取之。
    如果code1和code2经过按位与运算后的结果code1&code2不等于0,说明P1和P2同时在窗口的上方、下方、左方或右方,那么线段全部位于窗口的外部,应弃之。
  5. 当2不满足时,确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。
  6. 求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点s处把线段一分为二。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。
  7. 画出当前的直线段p1p2。
  8. 算法结束。

实验作业:

  1. 假设裁剪窗口参数为wxl=250;wxr=850;wyb=250;wyt=450;其中,wxl为左侧裁剪边,wxr为右侧裁剪边,wyb为下侧裁剪边,wyt为上裁剪边。
    编写unsigned int EnCode(double,double);函数,实现对直线端点的编码。
    提示:编码的代码实现区域编码思路:如,端点在裁剪窗口左侧,其编码最后一位为1,可以按位或0001,将编码最后一位至1.
    代码:
unsigned int CCohenSutherlandView::EnCode(CPoint point)
{int C1=0;if (point.x<wxl)C1=C1|D0;if (point.x>wxr)C1=C1|D1;if (point.y<wyb)C1=C1|D2;if (point.y>wyt)C1=C1|D3;return C1;
}
  1. 写出裁剪函数CohenSutherland(),并在OnDraw()里面绘制出裁剪窗口,绘制出裁剪后的直线,测试裁剪结果是否正确,给出至少三种情况的直线的裁剪,第一种情况,全部保留,第二种情况,完全去除,第三种情况,直线需要剪切。
    代码:
在CohenSutherlandView.h中:public:int wxl,wxr,wyb,wyt;unsigned int CCohenSutherlandView::EnCode(CPoint point);void CCohenSutherlandView::CohenSutherland(CPoint p1,CPoint p2,CDC *pdc);void CCohenSutherlandView::DDA(CPoint p1,CPoint p2,CDC *pdc,COLORREF color);
// 重写
在CohenSutherlandView.cpp中:#define D0 1 //0001
#define D1 2 //0010
#define D2 4 //0100
#define D3 8 //1000void CCohenSutherlandView::OnDraw(CDC* pDC)
{CCohenSutherlandDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;wxl=250,wxr=850,wyb=250,wyt=450;    //CPoint X(250,250);//左上    // CPoint Y(850,450);//右下pDC->Rectangle(wxl,wyb,wxr,wyt);CPoint A(500,400),B(800,420);//全部保留CohenSutherland(A,B,pDC);CPoint C(1000,500),D(900,500);//完全去除CohenSutherland(C,D,pDC);CPoint E(350,300),F(1200,300);//直线需要剪切CohenSutherland(E,F,pDC);// pDC->Polyline()// TODO: 在此处为本机数据添加绘制代码
}
void CCohenSutherlandView::CohenSutherland(CPoint p1,CPoint p2,CDC *pdc)
{int code1,code2,code;CPoint p;code1=EnCode(p1);code2=EnCode(p2);while (code1!=0||code2!=0){if (code1&&code2!=0)//全部位于外部return;if(code1!=0)code=code1;//部分在外部elsecode=code2;if ((D0&code)!=0)//Left {p.x=wxl;p.y=p1.y+(p.x-p1.x)*(p2.y-p1.y)/(p2.x-p1.x);}else if ((D1&code)!=0)//Right{p.x=wxr;p.y=p1.y+(p.x-p1.x)*(p2.y-p1.y)/(p2.x-p1.x);}else if ((D2&code)!=0)//Bottom{p.y=wyb;p.x=p1.x+(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y);}else if ((D3&code)!=0)//Top{p.y=wyt;p.x=p1.x+(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y);}if(code==code1)//p1在外部{p1.x=p.x;p1.y=p.y;code1=EnCode(p);}else{p2.x=p.x;p2.y=p.y;code2=EnCode(p);}}CPen pen;pen.CreatePen(PS_SOLID,5,RGB(0,255,255));pdc->SelectObject(&pen);pdc->MoveTo(p1);pdc->LineTo(p2);    }

截图:

计算机图形学 实验6 直线的裁剪—Cohen Sutherland裁剪算法(MFC中)相关推荐

  1. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  2. 计算机图形学实验——三维迷宫的创建及走迷宫过程中的交互功能的实现

    计算机图形学实验2 三维迷宫的创建及走迷宫过程中的交互功能的实现 OpenGL三维迷宫创建及交互 三维"图元"的绘制 迷宫结构的储存 视角转换的实现 碰撞检测 纹理贴图 小结 Op ...

  3. 《计算机图形学》实验报告 Cohen Sutherland裁剪算法

    一.实验目的和要求 熟悉光栅图形学中的相关直线段裁剪算法.理解Cohen-Sutherland裁剪算法. 二.实验内容 实现Cohen-Sutherland编码线段裁剪算法,能看到裁剪前后的屏幕显示效 ...

  4. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

    <计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...

  5. 【计算机图形学 】Cohen-Sutherland 直线裁剪算法 | OpenGL+鼠标交互

    文章目录 其他计算机图形学实验 前言 代码借鉴 步骤 1.点的结构体 2. 创建用于裁剪的窗口并绘制 3.画点函数 4. Cohen-Sutherland 直线裁剪算法部分 4.1 判断点所在位置,生 ...

  6. 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...

    PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...

  7. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  8. 计算机图形学画圆vc代码,计算机图形学实验--完整版-带结果--vc++实现.doc

    计算机图形学实验--完整版-带结果--vc实现 计算机图形学实验报告 信息学院计算机专业 20081060183 周建明 综括: 利用计算机编程语言绘制图形,主要实现以下内容: (1).中点算法生成任 ...

  9. 深圳大学计算机图形学实验4.1,深圳大学计算机图形学大作业实验报告.doc

    深圳大学计算机图形学大作业实验报告 深 圳 大 学 实 验 报 告 实验课程名称: 计算机图形学 实验项目名称: 计算机期末综合大作业 学院: 计算机与软件 专业: 计算机科学与技术 报告人: 班级: ...

最新文章

  1. 解决虚拟机 Virtualbox 中 linux 共享文件夹只读问题
  2. Java开发面试问题,牛逼轰轰!
  3. 笔记-项目配置管理-配置标识-配置识别与建立基线
  4. 不会这几个库,都不敢说我会Python爬虫
  5. Java嵌入oracle,Java插入Oracle Spatial空间数据
  6. 如何使用 AOP 和自定义注解?
  7. 程序控制流——Python基础语法
  8. 全功能短视频平台去水印解析页面源码
  9. wps ppt, 版式与母版
  10. URL中中文转码和解码
  11. 网传腾讯大规模裁员测试工程师,腾讯相关人员否认
  12. 刘乾四川大学计算机学院刘乾,刘乾亮
  13. ANSYS FLUENT瞬态模拟动画制作
  14. RMAN-06817: Pluggable Database CHARLESPDB cannot be backed up in NOARCHIVELOG mode.
  15. 鸿蒙电视厂商多少人,国产厂商崛起?鸿蒙之后这家厂商也推送了新系统,体验极佳...
  16. python 发包的方法_有没有快一点的Python扫描发包方法,原来的速度好慢
  17. latex如何使文字不空格_latex 段开头不空格
  18. Python Matplotlib绘制柱状图(bar和barh函数)详解
  19. CPU的功能和基本组成
  20. ubuntu基本操作命令超全(上)

热门文章

  1. matlab 毕业答辩,MATLAB的答辩.ppt
  2. MySQL中ESCAPE关键字的用法详解
  3. mysql数据库执行mysqladmin flush-hosts方法
  4. 老笔记本机械硬盘换固态装系统,再战10年!
  5. excel切片器_浅谈Excel , PBI 切片器系列之二:重新认识切片器
  6. Unity Dotween常用方法详解
  7. linux打包解压命令
  8. 股票中MACD如何计算,有什么意义
  9. python 赋值语句
  10. 灰色预测模型GM(1,1)