计算机图形学 | 裁剪与屏幕映射

[计算机图形学经典算法] Liang-Barsky(梁友栋-Barsky) 算法 (附Matlab代码) 刚学习了计算机图形学这门课程,为奠定根基的算法所倾倒,特此记录一二。 Liang-Barsky(梁友栋-Barsky) 梁友栋,福建福州人,1956-1960年,复旦大学,师从苏步青先生,80年代初,提出了Liang-Barskey裁剪算法,1984-1990年任浙江大学数学系主任。1991年,梁友栋先生获国家自然科学三等奖,学生谭建荣、汪国昭、王国瑾、鲍虎军、马利庄第二届“中国几何设 阅读详情

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 裁剪与屏幕映射

8.1 裁剪思想

裁剪的概念

观察空间不同,裁剪和屏幕映射的方法不同。

在这里插入图片描述

先在二维空间简化要解决的问题:对直线段p1(x1,y1)p2(x2,y2)进行裁剪。

在这里插入图片描述

裁剪一条直线段:

  1. 判断是否完全落在裁剪窗口内。
  2. 如果没有,再判断是否完全落在裁剪窗口外。
  3. 既不能确定完全落在裁剪窗口内又不能确定完全落在裁剪窗口外,则计算它与一个或多个裁剪边界的交点。

编码裁剪法

Cohen-Sutherland方法:基于编码的裁剪方法,是最早的最流行的二维裁剪方法。

基本思想:对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:

  1. 直线段完全可见,“简取”之。
  2. 直线段完全不可见,“简弃”之。
  3. 直线段既不满足“简取”的条件,也不满足“简弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。

编码:对于任一端点(x,y),根据其坐标所在的区域,赋予一个4位的二进制码D3D2D1D0。

编码规则如下:

  • 若x<wxl,则D0=1,否则D0=0;
  • 若x>wxr,则D1=1,否则D1=0;
  • 若y<wyb,则D2=1,否则D2=0;
  • 若y>wyt,则D3=1,否则D3=0。

在这里插入图片描述

裁剪一条线段时,先求出端点p1和p2的编码code1和code2,然后:

  1. 若code1 | code2 = 0,对直线段应简取之。
  2. 若code1 & code2 ≠ 0,对直线段可简弃之。
  3. 若上述两条件均不成立。则需求出直线段不窗口边界的交点。在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。

具体做法:按左、下、右、上的顺序求出直线段与窗口边界的交点,分段处理。

在这里插入图片描述

中点裁剪法

仍然基于Cohen-Sutherland中的区域编码。

基本思想:当对直线段不能简取也不能简弃时,简单地把线段等分为二段,对两段重复上述测试处理,直至每条线段完全在窗口内或完全在窗口外。

具体过程:

在这里插入图片描述

本质:用二分逼近的方法求线段不窗口边界的交点。

在这里插入图片描述

Liang-Barsky算法

将线段看成有方向性:外到内、内到外。

在这里插入图片描述

Liang-Barsky裁剪的思想:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实例:试用liang-barsky算法裁剪图中的线段AB。

在这里插入图片描述

解:直线段AB的参数方程为:

x=3+u·(-2-3),y=3+u·(-1-3,(0 ≤ u ≤ 1)

即:

x=3-5u,y=3-4u,(0 ≤ u ≤ 1)

这里:wxl=0,wxr=2,wyb=0,wyt=2。

因此:

p1= x1-x2=5>0,q1= x1–wxl=3
p2= x2-x1 =-5<0,q2= wxr –x1=-1
p3= y1-y2 =4>0,q3= y1–wyb=3
p4= y2-y1 =-4<0,q4= wyt –y1=-1

可见P均不为0。

直线段不窗口边界的交点计算如下:
uk·pk=qk,k=1,2,3,4

则u1=0.6, u2=0.2, u3=0.75, u4=0.25。

由于有:p1 、p3大于0,p2、p4小于0

Uone=max(0,uk|pk<0,uk|pk<0)
Utwo=min(1,uk|pk>0,uk|pk>0)

因此:

Uone=max(0,u2,u4)=max(0,0.2,0.25)=0.25
Utwo=min(1, u1,u3)=min(1,0.6,0.75)=0.6

可见Uone<Utwo ,它们分别对应输出直线段的起点和终点。

由于有:x=3-5u,y=3-4u

因此:

Uone对应的交点为I(1.75,2)
Utwo对应的交点为J(0,0.6)
裁剪后输出线段的端点即为I(1.75,2)和J(0,0.6),四舍五入后为I(2,2)和J(0,1)。

8.2 真正的裁剪——在三维空间遇见多边形

真正的裁剪

在这里插入图片描述

在这里插入图片描述

多边形的裁剪

裁剪算法:Sutherland-Hodgeman多边形裁剪

基本思想:将多边形边界作为一个整体,每次用窗口的一个边界对要裁剪的多边形进行裁剪。

顺序:左、下、右、上。

在这里插入图片描述

概念:

在这里插入图片描述

逐边裁剪时遇到的四种情况:

在这里插入图片描述

Sutherland-Hodgeman算法的问题:无法正常操作凹多边形。

例如:下面的v2和v3是错误的裁剪点。

在这里插入图片描述

解决方案:

  • 方案1:将凹多边形分割成两个或更多的凸多边形,然后分别处理各个凸多边形。
  • 方案2:修改Sutherland-Hodgeman算法,沿着任何一个裁剪窗口边界检查顶点表,正确地连接顶点对。
  • 方案3:采用其他多边形裁剪方法,如Weiler-Atherton算法。

Weiler-Atherton算法

假定按顺时针方向处理顶点,且将多边形定义为Ps,窗口矩形为Pw。

算法从Ps的任一点出发,跟踪检测Ps的每一条边。

在这里插入图片描述

Weiler-Atherton算法步骤:

  1. 由不可见侧进入可见侧,则输出可见直线段,转3
  2. 由可见侧进入不可见侧,则从当前交点开始,沿窗口边界顺时针检测Pw的边,找到Ps与Pw最靠近当前交点的另一交点,输出可见直线段和由当前交点到另一交点之间窗口边界上的线段,然后返回处理的当前交点
  3. 沿着Ps处理各条边,直到处理完Ps的每一条边,回到起点为止

示例:

在这里插入图片描述

三维空间中的裁剪

Cohen-Sutherland裁剪的推广。

在这里插入图片描述

在这里插入图片描述

三维形体裁剪问题:Sutherland-Hodgeman算法的推广。

在这里插入图片描述

逐边裁剪多边形:逐边裁剪多边形的每条边
输出:顶点序列构成多边形

逐面逐个裁剪多个多边形:逐面裁剪多边形的每条边
输出:顶点序列,构成多面体

8.3 几何阶段的完结:屏幕映射

屏幕映射

屏幕映射:裁剪空间向屏幕空间的映射。

在这里插入图片描述

过程分析:

在这里插入图片描述

在这里插入图片描述

OpenGL的几何阶段实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

指定裁剪空间:以透视投影为例

glm::mat4 proj =glm::perspective(45.0f, 1.3f, 0.1f, 100.0f);

在观察空间中指定裁剪空间:

  • 第一个参数定义了视野的角度fov
    对于一个真实的观察效果,它的值经常设置为45.0,但想要看到更多结果你可以设置一个更大的值。
  • 第二个参数设置了宽高比,由视口的高除以宽
  • 第三个参数设置了前截面的位置
  • 第四个参数设置了后截面的位置

在这里插入图片描述

在这里插入图片描述

之前的变换基于行矩阵:

在这里插入图片描述

现在在OpenGL中改为列矩阵:

在这里插入图片描述

OpenGL中的PVM观察变换:

gl_Position = projection * view * model * vec4(aPos, 1.0);
计算机图形学中的渲染流水线概述摘录 2.1 综述2.1.2 什么是渲染流水线(概念流水线)ü  计算机的渲染流水线:计算机的图像渲染工作流水线和工厂的运作的流水线是有一定的相似性的。渲染流水线的工作任务在于从一个3D的场景出发,生成(或者说渲染)我们屏幕上看到的一张2D的图像。计算机从一系列的Mesh网格数据(3D场景中的模型展开后一般包括纹理贴图和在建模软件中以线框形式显示的模型文件,而这个文件就是模型的网格数据,就是我们所说的M... 阅读详情

相关推荐

Liang-Barsky 算法模拟矩形区域的直线剪裁

Liang-Barsky 算法模拟矩形区域的直线剪裁,用中点画线算法画直线

【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)

【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)

m0_65787507的博客 8128

Liang-Barsky直线段剪裁算法

这是我在图形学课上用MFC带窗口的界面编写的直线段Liang-Barsky剪裁算法 算法准确 注释清晰 供大家分享

计算机图形学——Liang-Barsky算法

Liang-Barsky算法

weixin_56010243的博客 3190

liang barsky裁剪算法实现 以及运行exe

liang barsky裁剪算法实现 以及运行exe 多直线 多裁剪窗口 同时裁剪 线段分明 画线方式使用DDA算法

liang-barsky:Liang-Barsky剪切线算法

Liang-Barsky剪线算法 快速,破坏性实现。 它通过矩形裁剪2D线段。 这是对的改编,其简单性给我留下了深刻的印象。 API 破坏性的 var a = [ - 10 , - 10 ] , b = [ 10 , 10 ] ; clip ( a , b , [ - 5 , - 5 , 5 , 5 ] ) ; // returns 1 - "clipped" console . log ( a ) ; // [-5, -5] console . log ( b ) ; // [5, 5] 无损 var a = [ - 10 , - 10 ] , b = [ 10 , 10 ] ; var an = a . slice ( ) , bn = b . slice ( ) ; clip ( a , b , [ - 5 , - 5 , 5 , 5 ] , an , bn ) ; // returns 1 - "clipped" console . log ( an ) ; // [-5, -5] cons

计算机小白也看得懂的Liang-Barsky算法

个人博客:www.vectormoon.net 算法背景     Liang-Barsky算法由梁友栋和Barsky共同发表,是目前计算机图形学最经典的算法之一。他们认为线段裁剪的问题是:裁剪窗口是二维对象,而线段是一维对象,两个对象的维度不同不便比较。他们给出的解决思路是,将裁剪线段和裁剪窗口看为点集裁剪的结果是两个点集的交集。 算法思想     Liang-Barsky算法的主要思想有两部分: 用参数方程表示直线 将待裁剪直线看作是一个有方向的线 用参数方程表示直线     算法背景中提到Liang

矢月的博客 8064

Logisim实战:手把手教你搭建GB2312汉字字库(附完整电路图)

本文提供了一份详尽的Logisim实战指南,手把手教你如何利用存储芯片,通过位扩展和字扩展技术,构建一个完整的GB2312汉字字库。文章深入浅出地讲解了从编码原理、系统架构设计到具体电路实现与调试的全过程,是学习计算机组成原理和数字电路设计的绝佳实践项目。

k6l7m8n9的博客 811

【计算机图形学】【OpenGL】基于窗口的Liang-Barsky的折线段裁剪的实现

【计算机图形学】【OpenGL】基于窗口的Liang-Barsky的折线段裁剪的实现

qq_54779874的博客 2604

马尔可夫网络和贝叶斯网络的一些总结

马尔可夫网络和贝叶斯网络的一些总结 最近学习了一些关于概率逻辑的知识图谱推理方法,主要就是贝叶斯网络和马尔可夫网络,在此总结一下,内容都来自网络资料,这里加入了一下个人的理解,尽量为大家避雷! 这篇文章是我目前在网络上找到的关于贝叶斯网络最清晰的介绍,大家有兴趣可以去看看 贝叶斯网络中比较重要的两部分就是贝叶斯网络的结构和条件概率表。 贝叶斯网络的结构 下面通过一个例子来介绍: 贝叶斯网的网络结...

qq_43654303的博客 4374

华为防火墙 策略路由实现多ISP接入Internet

PC3上网访问Server1时走ISP1。PC4上网访问Server1时走ISP2。1、配置接口IP并加入相应的安全区域。二、ISP2 运营商 R2路由器。一、ISP1 运营商 R1路由器。

一直被模仿,从未被超越 3016

计算机图形学学习笔记(6.1):直线段裁剪

屏幕映射的概念 如下图所示,要将实体显示在2D的屏幕上,需要先将实体在规范化的观察空间中进行投影变换,然后进行裁剪。这个过程就叫屏幕映射。 裁剪要处理的问题,就是将在观察窗口内部的图形裁剪出来,进行显示。在观察窗口之外的图形,将不被显示。如下图: 首先需要解决的是直线段裁剪问题。下面介绍两个非常著名的算法。 直线段裁剪 Cohen-Sutherland方法 要解决的...

大鹏的blog 3489

Android Jetpack 最全面试题及参考答案

要使用 WorkManager 定义一个异步任务,以下是详细步骤。首先,需要创建一个继承自 Worker 类的自定义类,这个类代表了要执行的具体任务逻辑。// 在这里编写具体的任务逻辑,比如从网络下载文件try {在上述代码中,doWork方法就是任务的核心执行逻辑所在,这里模拟了从给定的 URL 下载文件到本地的操作,若下载成功返回,若出现异常则返回。然后,在需要调度任务的地方,比如在某个 Activity 或者 Fragment 中,通过构建 WorkRequest 来安排任务执行。

大模型大数据攻城狮的专栏 1899

计算机图形学 | 投影变换

计算机图形学 | 投影变化

ProgramNovice的博客 4658

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 918

k8s配置habor作为镜像地址之后,如果harbor中没有镜像,如何设置自动从阿里云官方镜像仓库下载

通过 Harbor 的远端仓库可以集中管理。如果你在上游设置了 image prefix 为 library,那么对外访问 harbor.your-domain.com/library/nginx:latest 就会被 Harbor 去上游拉取 registry.cn-hangzhou.aliyuncs.com/library/nginx:latest 并缓存。- 将集群中的镜像地址改为 Harbor 的域名,比如 harbor.your-domain.com/library/nginx:latest。

极客栈 429

《高效学习OpenGL》之 投影变换 glFrustum(),gluPerspective(),glOrtho(),gluOrtho2D()

1.透视投影 void glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); void APIENTRY gluPerspective ( GLdouble fovy, GLdouble aspect,

编辑编辑器 3259

【异常】安装hermes-agent提示Git克隆仓库网络中断 fetch-pack: unexpected disconnect while reading sideband packet

本文分析了Git克隆仓库时出现网络中断错误的常见原因及解决方案。报错表现为连接被远程主机关闭、管道破裂或数据包意外终止,通常由网络不稳定、仓库过大或配置不当引起。提供了5种优先级排序的解决方法:1)使用浅克隆减少数据量;2)优化Git配置参数;3)切换网络或配置代理;4)检查SSH密钥设置;5)改用HTTPS方式克隆。特别推荐先尝试「浅克隆+HTTPS」组合方案快速验证,若问题持续再根据具体报错深入排查。文中包含详细的命令示例和配置说明,适合不同网络环境下的Git用户参考。

奶爸的编程之路,也就一周冷个三天 1422

The Graphics Rendering Pipeline

渲染管线,这章主要讲光栅化渲染管线。 毕业前实习时,也实现过一个简单的软光栅化渲染管线,再复习一下。 在计算机图形学领域,shading指基于表面相对灯光的角度、距灯光的距离、相对于相机的角度和材质的属性等来修改物体/表面/多边形的颜色,进而创造一个具有真实感效果的过程。 In computer graphics, shading refers to the process of altering the color of an object/surface/polygon in the 3D sce

weixin_43313321的博客 407

(四) OpenClaw-Skill技能全面了解和自定义技能

OpenClaw Skills是提升AI代理功能性的关键模块。本文系统介绍了Skills的核心概念、获取渠道和创建方法。Skills作为标准化指令集合,能让OpenClaw从单纯理解升级为实际执行任务,相比传统System Prompt具有模块化、可复用等优势。用户可通过Clawhub官方商店、GitHub社区等渠道获取5700+现成技能,或按需开发自定义Skill。文章详细演示了创建"Hello World"示例技能的完整流程,包括编写Python脚本、配置SKILL.md文件、部署。

直到世界的尽头 8299

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华科_图形学笔记_07_投影变换

计算机图形学_华中科技大学_中国大学MOOC(慕课) 7.1_有趣的投影 由于我们的观察设备是二维的,因此,最终都存在一个三维向二维的映射过程。这个映射过程,按照几何意义来说就是投影。 而在我们之前讲到的观察变换中,其实还有一个隐含着的概念,观察平面。 那么这个平面,也可以叫做投影平面,我们看到的景物,都需要投影到这个平面上。 一个是平行投影。工程上我们用到的三视图,学习几何的时候用到的轴测图,都属于平行投影。 与平行投影相对而言的是透视投影。 最初接触这个概念应该是接

精密时空设计局 2279

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

本文由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.youkuaiyun.com/poem_qianmo/article/details/70544201这篇文章是解析计算机图形学界“九阴真经总纲”一般存在的《Real-Time Render...

少得多惑的博客 216

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机图形学小总结

计算机图形学 1. 坐标系和空间,空间的转换 物体坐标系(本地坐标系):Local Space或Model Space; 世界坐标系 World Space 观察者坐标系(摄像机坐标系) View Space 裁剪空间 Clipping Space 屏幕空间 Screen Space ​ 其中前四个矩阵之间,主要通过**model, view, projection矩阵进行相关的变换, 裁剪空间到屏幕空间通过视口变换进行;前三个是三维空间,后面两个是二维空间。 ​ 所

qq_36493878的博客 730

CG与CV视角对矩阵的理解

从图形学看,矩阵是画笔。你把矩阵乘在这个点上,点就动了、转了、变成像素了。重点在于变换的层次结构(父子节点关系)。从视觉看,矩阵是密码。你看到的是结果,矩阵里隐藏着相机的位置、镜头的畸变或者两个视角之间的几何关系。重点在于利用线性代数工具(如 SVD、特征值分解)去破解这个矩阵。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1201

【转载】《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

本文由@浅墨_毛星云 出品。 &nbsp...

一个小码农的博客 216

三维观察流水线的理解

在计算机图形学中,渲染图形的过程可以分为两大类:第一步是T&L过程全称是Transforming and Lighting,即顶点的坐标变换和光照过程,通常称为顶点变换流水线;第二步就是光栅化,对于光栅化就是按照图形顶点信息设置对应的像素的颜色,然后呈现在屏幕上。下面我们以DirectX3D中的T&L过程为例,说明具体的过程。DirectX3D中图形的顶点的坐标系是三维坐标系,而计算机的屏幕则是一个

Linear_Luo的专栏 2703
上一篇: Leetcode521. 最长特殊序列 Ⅰ
下一篇: 计算机图形学 | 实验六:旋转立方体
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值