计算机图形与OpenGL学习六(二维观察4.Cohen-Sutherland线段裁剪算法)

原创 2018年04月17日 20:19:58

 Cohen-Sutherland线段裁剪算法

Cohen-Sutherland线段裁剪算法,通过初始测试来减少交点计算,从而减少线段裁剪算法所用的时间。每条线段的端点都赋以称为区域码的四位二进制码,每一位用来标识端点相对于相应裁剪矩形边界的里面还是外面。我们可以按任意顺序引用窗口边界,图1给出了一种编码顺序。


图1 区域码的各位与相应裁剪窗口边界的一种顺序

编码规则为:码位的值为1(真)表示端点在相应窗口边界的外面;码位的值为0(假)表示端点不在相应窗口边界的外面(在内部或在边界上)。在这种顺序下,四个窗口边界一起生成了九个区域,图2列出了这些区域的二进制码。

图2 标识线段端点相对于裁剪窗口位置的9个二进制区域码

区域码的位值通过将端点的坐标值(x,y)与裁剪窗口边界相比较而确定,如x<xwmin则位1为1,如y>ywmax,则位4为1,其他各位与此类似。除了使用不等式测试,我们还可以使用位处理操作和下列两步操作来高效地确定区域码的值:(1)计算端点坐标与裁剪边界的差。(2)用各差值计算的符号位来设置区域码中相应的值。按图1的顺序,位1设置x-xwmin的符号位;位2设置xwmax-x的符号位;位3设置y-ywmin的符号位; 位4设置ywmax-y的符号位。(计算机中的符号位,就是在处理二进制数据时,专门规定有一位,是用来确定数据的正负,符号位是1表示负数,是0表示正数)。
一旦给所有的线段端点建立了区域码,就可以快速判断哪条线段完全在裁剪窗口之内,哪条线段完全在窗口之外。完全在窗口边界内的线段,其两个端点的区域码均为0000,因此保留这些线段。有一对相同码位都为1的线段,则完全落在裁剪矩形之外,因此丢弃这些线段。
测试线段是否在内部或外部的方法是对两个端点的区域码进行逻辑操作。如果两个端点的区域码逻辑或运算结果为0000,则线段完全位于裁剪区域之内。如果两个端点的区域码逻辑与运算结果为真(不为0000),则线段完全位于裁剪区域之外。
对于不能判断为完全在窗口外或窗口内的线段,则要测试其与窗口边界的交点。如图3所示,这些线段可能穿过或不穿过窗口内部。因此可能要进行多次求交运算才能完成一条线段的裁剪。

 
图 3 几种不同类型的线段
求交次数依赖于选择裁剪边界的顺序,每次处理一条裁剪边界后,裁掉其中一部分,余下部分对照窗口的其余边界进行检查。该过程一直进行到线段完全被裁剪掉或余下的线断部分完全在窗口内。要检查一线段是否与某裁剪边界相交,可以检查其两端点区域码的相应位,如果其中一个是1而另一个是0,则该线段与该边界相交。
我们以上图的EF线段进行一个模拟,假定窗口边界的处理顺序如下:左、右、下、上。E端点的区域码为1000,F端点的区域码为0110。详细处理过程如下:
1.检查左边界,两端点的左边界区域码都为0,说明都在左边界的内部,不与左边界相交。
2.检查右边界,E端点右边界区域码为0,说明E端点在右边界内部;F端点右边界区域码为1,说明F端点在右边界外部,线段在右边界相交,我们计算线段与右边界相交点(p1),并裁剪p1-F线段部分,如图4。
 
图4 计算右边界与线段的交点P1,并裁剪掉线段P1F


3.检查下边界,E端点下边界区域码为0,说明E端点在下边界内部;P1端点下边界区域码为1,说明P1端点在下边界外部,线段在下边界相交,我们计算线段与下边界相交点(P2),并裁剪p2-p1线段部分,如图5。


图5 计算下边界与线段的交点P2,并裁剪掉线段P2F


4. 检查上边界,E端点上边界区域码为1,说明E端点在上边界外部;P2端点上边界区域码为0,说明P2端点在上边界内部,线段在上边界相交,我们计算线段与下边界相交点(P3),并裁剪E-P3线段部分,如图6。
 
图6 计算上边界与线段的交点P3,并裁剪掉线段P3E

至此,线段裁剪完成。

上述手工模拟只是阐述了算法过程,但是还有一个问题是如何求取交点?

线段与裁剪边界的交点计算可以使用斜率截距式的直线方程。对于端点坐标为(x0,y0),(x_end,y_end)的线段,与垂直边界交点的y坐标可以由下列等式计算得到:



同样,要寻找水平边界相交的交点,其x坐标可以由下列等式计算得到:




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhs322/article/details/79980114

中点分割裁剪算法

中点分割裁剪算法(python)实验目的 采用中点分割方法找到距离线段顶点最近的可见点,找到后,进行绘制,即可实现直线段在裁剪窗口的裁剪显示。算法思想 设要裁剪的线段是P1P...
  • sinat_34686158
  • sinat_34686158
  • 2017-12-07 20:15:09
  • 337

OpenGL.裁剪算法

裁剪就是来确定 哪些是位于视景体内,应当被最后成图来考虑的 哪些是位于视景体外,不需要后续的处理了(因为不属于成图范围嘛) 线段的裁剪算法 Cohen-Sutherlend算法 这是一种很巧妙的裁...
  • stringNewName
  • stringNewName
  • 2016-06-06 21:08:03
  • 2185

编程实现中点分割裁剪算法,显示裁剪前的线段及裁剪后的线段

  • 2014年05月28日 13:31
  • 3KB
  • 下载

图形学_二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland

一、Cohen-Sutherland剪裁算法 1.基本思想 对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该...
  • bcj296050240
  • bcj296050240
  • 2015-05-15 16:29:40
  • 958

计算机图形学-基于OpenGL的直线段的裁剪算法

计算机图形学-直线段的裁剪算法在Opengl应用框架下实现C-S裁剪算法或L-B裁剪算法。完成一个四边形对两条线段的裁剪:四边形的左上角和右下角顶点分别为(100,100),(300,200),线段1...
  • u010968957
  • u010968957
  • 2017-05-28 09:57:40
  • 1712

计算机图形学 运用 中点分割直线段裁剪算法原理

// 实验二View.cpp : implementation of the CMyView class // #include "stdafx.h" #include "实验二.h" #in...
  • jiangliqing1234
  • jiangliqing1234
  • 2011-11-08 21:19:49
  • 6193

opengl 直线裁剪Cohen-Sutherland算法

#include #include class wcPt2D { public: float x, y; };GLubyte encode(wcPt2D pt, wcPt2D winMin, ...
  • DeMonliuhui
  • DeMonliuhui
  • 2016-11-11 18:47:57
  • 1920

计算机图形学 Cohen- Sutherland直线段裁剪算法

  • 2014年11月05日 15:03
  • 32KB
  • 下载

计算机图形学Opengl实现二维图形的…

实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动),请首先读懂代码,再修改代码,实现矩形在窗口内沿着水平线匀速移动。为了实现这类要求,要做的就是将已经给出的旋转的代码块部分修改为平移的实现方法,完...
  • CHINAonlyQiu
  • CHINAonlyQiu
  • 2013-08-23 15:07:50
  • 1856

opengl实现cs、liang-barsky直线裁剪算法

#include #include #define L 00001 #define R 00002 #define B 00004 #define T 00010 #define M 00000 #...
  • lcc_633
  • lcc_633
  • 2017-03-04 09:54:40
  • 1625
收藏助手
不良信息举报
您举报文章:计算机图形与OpenGL学习六(二维观察4.Cohen-Sutherland线段裁剪算法)
举报原因:
原因补充:

(最多只允许输入30个字)