前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python+OpenGL实现Liang-Barsky算法裁剪直线

Python+OpenGL实现Liang-Barsky算法裁剪直线

作者头像
Python小屋屋主
发布2022-04-13 14:38:07
6600
发布2022-04-13 14:38:07
举报
文章被收录于专栏:Python小屋Python小屋

任务描述:

Liang-Barsky参数化裁剪算法是计算机图形学领域一个经典算法,用来对二维直线进行快速裁剪,使得仅需要绘制直线段落在裁剪窗口中的部分,不显示裁剪窗口之外的内容。

算法原理:

如上图,点p1(x1,y1)、p2(x2,y2)确定一条直线段,其与矩形裁剪窗口(左右边界x坐标左右分别为xL和xR,上下边界y坐标分别为yB和yT)四个边的交点分别为A、B、C、D,在A、B、p1这三个点中选择参数最大(距离终点p2最近)的一个点(即B),从C、D、p2这三个点中选择参数最小(距离起点p1最近)的一个点(即C),这两点之间的线段BC即为最终可见部分。

在该算法中,使用下面的参数方程表示直线p1p2,

x = x1 + t×dx

y = y1 + t×dy

其中,dx = x2 - x1,dy = y2 - y1,t∈[0,1]。

直线p1p2与裁剪窗口左、右、下、上四条边界的交点参数计算公式为,

左边界参数:t1 = (x1-xL) / -dx

右边界参数:t2 = (xR-x1) / dx

下边界参数:t3 = (y1-yB) / -dy

上边界参数:t4 = (yT-y1) / dy

在上面四个公式中,分母小于0时计算得到的参数距离直线段起点更近,分母大于0时计算得到的参数距离直线段终点更近,分母等于0时直线段与裁剪窗口平行需要单独计算。

以上图为例,有dx>0且dy<0,所以t1(点A)和t4(点B)是距离直线段起点p1更近的两个参数,已知起点p1对应的参数为0,所以最终可见部分线段的起点参数为max(0, t1, t4),得到点B。同理,t2(点C)和t3(点D)是距离直线段终点p2最近的两个参数,已知终点p2对应的参数为1,所以最终可见部分的终点参数为min(1, t2, t3),得到点C。于是,直线段p1p2落在裁剪窗口中的部分为线段BC。

参考代码:

运行效果:

http://mpvideo.qpic.cn/0b2etuaakaaaymair6zjlvrfbhodawoqabia.f10002.mp4?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档