Cohen-Surtherland算法

新建一个文档命名为1124,文档类型为单文档。
创建CP2类

右键1124 classes,点击new class新建一个类CP2:


在CP2类中声明三个域:(double x;double y;UINT rc;)

找到cpp文件,在里面引用CP2这个类:(#include “P2.h”)


在CView类中新建两个CP2类型的变量p0、p1和四个成员变量(定义矩形的四个方向的边界):

(这四个边界变量用double、int都可以)


在构造函数中给这四个变量赋值。

CMy11122View::CMy11122View()
{// TODO: add construction code herewxl=-300,wyb=-100,wxr=300,wyt=100;
}

新建函数DrawClipWindow(CDC*pDC),用来画矩形。

void CMy11122View::DrawClipWindow(CDC*pDC)
{CRect rect(wxl,wyb,wxr,wyt);pDC->Rectangle(rect);
}

在OnDraw函数中调用画矩形函数

void CMy11122View::OnDraw(CDC* pDC)
{CMy11122Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);DrawClipWindow(pDC);//绘制裁剪窗口// TODO: add draw code for native data here
}

增加鼠标点击函数:

  1. 新建成员变量flag(用来判断赋值给p0还是p1,以及画线)

  2. 在构造函数中将flag初始化为0

CMy11122View::CMy11122View()
{// TODO: add construction code herewxl=300,wyb=100,wxr=700,wyt=400;flag=0;
}


3. 双击WM_LBUTTONDOWN添加该函数,点击Add and Edit编辑函数。

4. 在函数中编写如下代码:

void CMy11122View::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCDC*pDC=GetDC();if(flag==0){p0.x=point.x;p0.y=point.y;flag=1;}else{p1.x=point.x;p1.y=point.y;pDC->MoveTo(p0.x,p0.y);pDC->LineTo(p1.x,p1.y);flag=0;}CView::OnLButtonDown(nFlags, point);
}

创建编码函数:

#define LEFT 0x1    //代表:0001
#define RIGHT 0x2    //代表:0010
#define BOTTOM 0x4   //代表:0100
#define TOP 0x8   //代表:1000void CMy1112View::EnCode(CP2 &pt)
{pt.rc=0;if(pt.x<wxl)pt.rc=pt.rc | LEFT;else if(pt.x>wxr)pt.rc=pt.rc | RIGHT;if(pt.y<wyb)pt.rc=pt.rc | BOTTOM;else if(pt.y>wyt)pt.rc=pt.rc | TOP;
}

创建Cohen函数:

添加代码:(我用的方法是在函数开始时用白色画笔覆盖所画的线,再重画裁剪后得到的线)

void CMy11122View::OnCohen()
{CDC*pDC=GetDC();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(255,255,255));pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(p0.x,p0.y);pDC->LineTo(p1.x,p1.y);pDC->SelectObject(pOldPen);// TODO: Add your command handler code hereCP2 p;//交点坐标EnCode(p0);//起点编码EnCode(p1);//终点编码while(p0.rc!=0 || p1.rc!=0)//处理至少一个顶点在窗口外{if((p0.rc & p1.rc)!=0)//简弃之{return;}if(0==p0.rc)//确保p0位于窗口之外{CP2 Temp;Temp=p0;p0=p1;p1=Temp;}UINT RC=p0.rc;double k=(p1.y-p0.y)/(p1.x-p0.x);//斜率if(RC & LEFT)//p0点位于窗口的左侧{p.x=wxl;//计算交点y坐标p.y=k*(p.x-p0.x)+p0.y;}else if(RC & RIGHT)//p0点位于窗口的右侧{p.x=wxr;//计算交点y坐标p.y=k*(p.x-p0.x)+p0.y;}else if(RC & BOTTOM)//p0点位于窗口的下侧{p.y=wyb;//计算交点x坐标p.x=(p.y-p0.y)/k+p0.x;}         else if(RC & TOP)//p0点位于窗口的上侧{p.y=wyt;//计算交点x坐标p.x=(p.y-p0.y)/k+p0.x;}EnCode(p);p0=p;}pDC->MoveTo(p0.x,p0.y);pDC->LineTo(p1.x,p1.y);
}

为Cohen添加菜单函数:

  1. 在此处双击:

  2. 双击“帮助”后的空白处

  3. 编辑菜单属性

  4. 在空白处右键建立类向导:


    点击Edit Code,将Cohen函数复制到OnCohen中来:

    运行,用鼠标任意点两点,画线

    点击裁剪:

    裁剪多条直线效果(此方法只能画一条线裁剪一次):

梁友栋算法

梁友栋裁剪算法:
把EnCode和Cohen函数中的裁剪部分算法换成LBLineClip函数即可。

void CMy11122View::OnCohen()
{CDC*pDC=GetDC();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(255,255,255));pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(p0.x,p0.y);pDC->LineTo(p1.x,p1.y);pDC->SelectObject(pOldPen);double tmax,tmin,dx,dy;dx=p1.x-p0.x;dy=p1.y-p0.y;tmax=0.0,tmin=1.0;if(ClipTest(-dx,p0.x-wxl,tmax,tmin)) //窗口边界的左、右、下、上顺序裁剪直线{if(ClipTest(dx,wxr-p0.x,tmax,tmin)){         if(ClipTest(-dy,p0.y-wyb,tmax,tmin)){if(ClipTest(dy,wyt-p0.y,tmax,tmin)){if(tmin<1.0)//判断直线终点{p1.x=p0.x+tmin*dx;p1.y=p0.y+tmin*dy;                       }if(tmax>0.0)//判断直线的起点{p0.x=p0.x+tmax*dx;p0.y=p0.y+tmax*dy;                          }}}}}pDC->MoveTo(p0.x,p0.y);pDC->LineTo(p1.x,p1.y);
}
BOOL CMy11122View::ClipTest(double u,double v,double &tmax,double &tmin)//裁剪测试函数
{double t;BOOL ReturnValue=TRUE;if(u<0.0)//从裁剪窗口的外部到内部,计算起点处的tmax{t=v/u;if(t>tmin)ReturnValue=FALSE;else if(t>tmax)tmax=t;}else{if(u>0.0)//从裁剪窗口的内部到外部,计算终点处的tmin{t=v/u;if(t<tmax)ReturnValue=FALSE;else if(t<tmin)tmin=t;}else//平行于窗口边界的直线{if(v<0.0)//直线在窗口外可直接删除ReturnValue=FALSE;}}return(ReturnValue);
}

计算机图形学-二维图形的裁剪相关推荐

  1. 计算机图形学——二维图形变换裁剪

    算法描述 1.基本变换矩阵 (1).缩放矩阵 void ScaleMatrix(float Sx, float Sy, float m[3][2]) {for (int i = 0; i < 3 ...

  2. 计算机图形学-二维图形变换 笔记总结与代码实战

    文章目录 1.向量基础知识 2.图形坐标系 3.二维图形变换原理 4.二维图形几何变换 5.窗口视区变换 基本二维几何变换代码 二维复合变换实战-五星红旗绘制 1.向量基础知识 为什么向量如此重要:在 ...

  3. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

  4. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  5. 计算机图形学——二维图形几何转换

    文章目录 一.实验目的 二.实验要求 三.实验步骤 1.打开直线扫面转换MFC项目工程,及其中的直线类CLine. 2.二维点类CP2添加齐次坐标 3.设计实现二维图像几何变换类 1.新建二维图形几何 ...

  6. 计算机图形学--二维图形变换

    目录 概述 平移 对称 旋转 错切 缩放 概述 对于二维图形来讲,所有基本变换均可以通过确定图形的点的平移.对称.旋转.错切以及缩放几种变换组合得到,而在上述几种变换中,除对称变换外,其余变换均可通过 ...

  7. 计算机图形学二维图形基本变换实验原理,【实验课件】二维及三维图形基本变换的实现...

    实验二 二维及三维图形基本变换的实现 一.实验学时 4学时 二.实验类型 设计型实验 三.实验目的和要求 1. 掌握二维图形变换的原理,对一条直线实现二维基本变换(平移.错切.比例.旋转). 2. 掌 ...

  8. 计算机图形学-二维图形-几何变换

    几何变化 一.概述 图形变换:是一种几何变换,在二维图形处理过程中,常常需要对平面图形的形状,尺寸,显示方向和显示位置进行修改,来达到改变图形的目的. 几何变换:是一种先行变换,对原来图形中的一点坐标 ...

  9. 图形学-二维图形的裁剪1.Cohen 2.Liang

    Cohen 创建新类CP2 class CP2 {public:CP2();virtual ~CP2();public:double x;double y;UINT rc;}; 右键view类,添加如 ...

  10. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt

    计算机图形学 二维变换及二维 第三章 二维变换及二维观察 本章主要内容 3.1二维图形的基本变换 3.2窗口视图变换 3.3复合变换 3.4二维图形裁剪 3.5本章小结 3.1 二维图形的基本变换 3 ...

最新文章

  1. (转)详解css3弹性盒模型(Flexbox)
  2. js变量以及其作用域详解
  3. 3.1.3 训练/开发/测试集的问题以及注意事项
  4. Flink SQL 在网易云音乐的产品化实践
  5. 2016 中国互联网仿冒态势分析报告
  6. 为什么说 Julia 更优于 Python?
  7. 计算机组成原理学习四笔记一
  8. 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
  9. mysql dump 到的文件_MySQL用mysqldump命令导出文本文件
  10. 读书笔记-集体智慧编程
  11. 最新HyperSnap绿色汉化版
  12. Linux如何自定义屏幕分辨率,Linux手动设置屏幕分辨率的办法
  13. laravel whereDoesntHave 查询不等于条件的数据
  14. 360评估应用的6大场景
  15. img: SVG格式在vue中的使用
  16. 北科计算机研究生导师推荐,北京科技大学计算机与通信工程学院-【喜报】我院班晓娟老师荣获第三届“研师亦友——我最喜爱的导师”称号...
  17. JS实现页面的自动滚动【自动阅读、JS小工具】
  18. xxljob从入门到精通-全网段最全解说
  19. 出彩的PPT封面如何设置?这些例子建议收藏
  20. 小米手机、华为手机、一加手机、小米手环NFC刷门禁卡教程!

热门文章

  1. linux遇到hint:num lock on
  2. 用css设置多段背景色
  3. gmail 邮箱服务器,gmail邮箱设置
  4. UBI文件系统的制作与挂载案例
  5. 不用工具直接从微软官网下载Win10正式版ISO镜像
  6. QT练习samp2_2_test——用按钮编辑文本框特性
  7. CodingBat python Warmup-2
  8. 传送的谷歌应用程序打不开_如何使用Google Home将内容传送到您的Chromecast
  9. 推荐|10 款好用的远程管理工具
  10. ubuntu18.04查看网卡mac地址