裁剪算法

Cohen-Sutherland算法(编码裁剪算法)

 

一、基本思想

采用编码的方式对直线段分三种情况处理

 

 

 

(3)重点在于2种情况都不满足的时候,需要按交点来进行分段,然后再判定。

 

二、编码规则

(1)以上三种情况都采用编码的方式来快速解决。

每条线段的端点偶读赋以四位二进制码D3D2D1D0,编码规则如下:

左右下上,即边界之外为1,否则为0。

 

(2)

 

三、具体实现

裁剪出一条线段,先求出端点编码code1和code2,然后进行“或” 和“与” 运算。

或0取,与非弃。

(3)若以上2种情况都不满足,例如:

 

此时将p1和p2的编码进行与或操作发现,或不为0,与为0。则采用分段的方法。按左右下上的顺序求出交点P3,P1P3在窗外则舍弃。

 

得到p3p2时,再对p3p2进行编码测试,发现也属于第三种情况。则再求出交点p4。经测试,p3p4可取,p4p2舍弃。

 

四、额外说明

(1)虚交点:对于舍弃的情况还有一种特例,如下图中的蓝线。

此时AB点进行编码测试也属于第三种情况,但是却需要舍弃。这就需要计算出虚交点,然后分段舍弃了AC和CB。

 

(2)交点的计算方法

因为通常都是已经边界坐标,所以都是利用斜率来按照左下右上的顺序计算交点。

 

 中点分割算法

一、基本思想

中点分割用到的测试方法仍然是编码测试,但是用二分逼近来确定直线段与窗口的交点。而具体的实现,也是根据中点的位置情况来讨论的。

 

二、具体实现

何为误差范围?

比如在1024的分辨率下,最多也就进行10次二分,不可能永远分下去。所以需要提前设定误差范围。

 

中点分割算法相比于Cohen-Sutherland算法,在一开始都是通过编码的思想去除了大量的直线全在裁剪窗口内和全在裁剪窗口外避免了求交,

只需计算中点坐标即可完成,宜于硬件实现 。

 

Liang-Barsky算法


一、基本思想

 把被裁剪直线看成一条有向线段并用参数方程表示,进而确定出要获取的部分。

1.参数表示

 

2.方向设定确认点

将四条边分为入边和出边

u1u2则为裁剪区域内的线段

 

3.不等式变换

裁剪区域内的点可由以上不等式得到,移项变换得

我们可以

 

4.分类讨论

(1)pk=0

a. p1&p2=0,此时直线垂直,若q1<0或q2<0则直线在裁剪区域外,直接舍弃。

                           

b.  p3&p4=0,此时直线平行,若q3<0或q4<0则直线在裁剪区域外,直接舍弃。

                         

c.  p1&p2=0且q1≥0或q2≥0,p3&p4=0且q3≥0或q4≥0(即上图B和F的情况)。则进一步根据交点判断。

 

(2)pk≠0

此处根据具体的ΔxΔy数据来得到pk的正负

 

 

如图,此种情况为舍弃。u1>u2

 

二、具体实现

 

转载于:https://www.cnblogs.com/jingrui/p/9697391.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyOpenGL 是一个 Python 绑定的 OpenGL API,它可以用于在 Python 中进行图形渲染和计算机图形学编程。在 PyOpenGL 中,裁剪(clipping)是指确定哪些几何图形在视口中可见,并将其进行显示,而隐藏不可见的部分。 PyOpenGL 提供了一系列函数和类来实现裁剪算法,其中最常用的是 `glScissor` 和 `glEnable` 函数。`glScissor` 函数用于定义裁剪矩形的大小和位置,它接受四个参数:左下角的 x 坐标、左下角的 y 坐标、矩形的宽度和矩形的高度。`glEnable` 函数用于启用裁剪功能。 以下是一个简单的示例代码,演示了如何在 PyOpenGL 中使用裁剪算法: ```python from OpenGL.GL import * from OpenGL.GLUT import * def draw(): glClearColor(0.0, 0.0, 0.0, 1.0) glClear(GL_COLOR_BUFFER_BIT) glEnable(GL_SCISSOR_TEST) glScissor(100, 100, 400, 300) glColor3f(1.0, 0.0, 0.0) glBegin(GL_TRIANGLES) glVertex2f(200, 200) glVertex2f(400, 200) glVertex2f(300, 400) glEnd() glFlush() glutInit() glutInitWindowSize(600, 400) glutCreateWindow(b"PyOpenGL Clipping Example") glutDisplayFunc(draw) glutMainLoop() ``` 这段代码创建了一个窗口,并在窗口中绘制了一个红色的三角形。使用 `glEnable(GL_SCISSOR_TEST)` 启用裁剪功能,然后使用 `glScissor(100, 100, 400, 300)` 定义裁剪矩形的位置和大小为 (100, 100) 到 (500, 400)。只有位于裁剪矩形内的图形才会被显示出来,而位于矩形外的部分将被裁剪掉。 希望这个例子能帮助你理解如何在 PyOpenGL 中使用裁剪算法。如果你有更具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值