[计算机图形学]几何:曲线和曲面(前瞻预习/复习回顾)

news2025/2/25 13:29:54

一、曲线

1.Bézier Curves—贝塞尔曲线

贝塞尔曲线也是一种显式的几何表示方法。贝塞尔曲线定义了一系列的控制点,致使确定满足这些控制点关系的唯一一条曲线:如上图定义的贝塞尔曲线满足 起始点为p0,结束点为p3,起始点的切线方向是p0p1方向,结束点切线方向是p2p3方向。

而事实上,我们在实际情况需要计算任意多个控制点的情况,也就是说不只是四个点才能画出一条贝塞尔曲线,一条贝塞尔曲线可以由任意多个控制点决定,那么如何根据这些控制点确定一条贝塞尔曲线呢?接下来我们将介绍几种算法。

(1)de Casteljau 算法

de Casteljau 算法其实是一种递归思想,我们以上图中的三个控制点的贝塞尔曲线也就是二次贝塞尔曲线为例,我们把每两个点b0-b1,b1-b2分别用0-1代替,中间某个时刻设为t,那么加入我们要找贝塞尔曲线上t时刻的点,假如是1/3,那么如上图,我们在b0-b1上找一点1/3,b1-b2上找一点1/3,把它们相连得到一条新的直线,在这条新的直线上再找1/3处一点,就是b1,b2,b3这三个控制点控制下的贝塞尔曲线的1/3处的位置,而遍历0-1间所有的t值,就可以得到这条贝塞尔曲线了。

 四个控制点的贝塞尔曲线同理,只不过多了一步取t位置的操作。

(2)代数公式法

de Casteljau算法可以得到一个系数金字塔,我们从上图可以看出,每一层都相当于在两点之间做了一个插值运算,从而最终形成一个金字塔。我们当然可以用数学形式把它表示出来如下图:

上图展示了三个控制点的贝塞尔曲线的代数表示形式,很好理解,如第一个公式:当t=0时,点的位置就是在最左边的点b0上,下面的公式都同理。最终得到最下面的公式很像1的展开,我们当然也可以通过这个三个控制点的公式推广出n个控制点的贝塞尔曲线的代数公式。

也就说给定n+1控制点,我们就可以得到一个n阶的贝塞尔曲线,这个贝塞尔曲线在任意时间t都是前面给出的n+1个控制点的线性组合,线性组合的系数是一个和时间有关的多项式,这个多项式就是伯恩斯坦多项式(Bernstein),也就是描述二项分布的多项式。简单的说,就是任意一个n阶贝塞尔曲线,它的时间为t的点位置就是由伯恩斯坦多项式为系数对给定的一系列控制点的加权。

同时我们也并没有说,贝塞尔曲线只能在平面上定义,我们可以把控制点设为三维空间中的坐标从而得出三维空间中的贝塞尔曲线代数公式,如上图

 Bernstein多项式

(3)贝塞尔曲线的性质

前两条性质我们前面已经提到过了,直接看第三条,贝塞尔曲线的控制点在仿射变换后,如果把这些控制点再连成新的贝塞尔曲线,那么前后两个贝塞尔曲线是不变的,但也仅仅是在仿射变换下,如投影变换则不满足这种性质。第四条凸包性质:贝塞尔曲线一定在自己所有控制点所连成的凸包多边形的里面。如下图中的蓝色线为控制点连成的凸包,那么这几个控制点所形成的贝塞尔曲线一定在蓝色线框的里面。

2.Piecewise Bézier Curves—逐段贝塞尔曲线

为什么要引进逐段贝塞尔曲线呢?如上图中的一段贝塞尔曲线,对于这种过于曲折的贝塞尔曲线,我们想通过一系列控制点控制是非常难的,于是人们想到了办法,用较少的几个控制点控制一小段贝塞尔曲线,当想表示的段数足够时,把它们连在一起就是想要的完整的贝塞尔曲线。

如上图中的黑色点就是每段贝塞尔曲线的起止点,而蓝色点则是和黑色起止点相连并控切线方向的点,通过每四个点定义一段贝塞尔曲线,并且最终把它们连起来的方法就是逐段贝塞尔曲线。

逐段贝塞尔怎么确保连续呢?事实上,逐段贝塞尔有许多不同的连续,如上图所示就是逐段贝塞尔的C0连续,它代表只要曲线在中间没有间断,两段曲线都经过一个点(第一段终止点等于第二段起点)。

第二种连续是切线连续,也就是C1连续,两端切线长度要相等,且一阶导数相等。这样不仅能保证几何上的链接,还可以保证光滑。当然我们还有很多其它的连续,比如当二阶导数相等,或者更高阶的导数相等。但在这里我们只介绍这两种。

3.Spline—样条

图形学中运用的曲线不止贝塞尔曲线,还有其它,如样条:一条由一系列控制点控制的一条连续的曲线,在任一点都满足一定的连续性,几阶连续取决于实际情况。

4.B-splines—B样条

B样条也就是basis样条,也就是基函数样条,具有局部性。我们提到当有多个,如十个控制点的时候,想调整一整个曲线是非常困难的,因为一个控制点的调整会影响许多其它控制点,于是我们引入了逐段贝塞尔曲线,但是逐段仍然够简便,所以我们又引入了B样条,它不仅具有局部性,而且是一整段连续的曲线,同时它也比贝塞尔曲线更复杂,这里不做过多介绍。还有更复杂的NURBS,感兴趣的朋友可以自行了解。

二、曲面

1.Bézier Surfaces—贝塞尔曲面

贝塞尔曲面,也就是贝塞尔曲线的扩展, 如上图,我们可以想象有一个4x4的网格,在一个方向上的四条线对应了四条贝塞尔曲线,而在另一个方向坐标值相同的一行,每条曲线上有4个点,它们也会构成一条贝塞尔曲线,那么只要将这条直线一扫,就可以得到一个贝塞尔曲面。当然,这里也有很多问题,比如,不同的贝塞尔曲面,要怎么把它们严丝合缝的拼在一块,这里同样不介绍,感兴趣的朋友自行了解。

 那么如何找到贝塞尔曲面上任意一点的位置,我们可以想到,当扩展成曲面之后,我们则需要两个时间变量t,这里我们设为u和v。

那么我们只要现在如上图的4x4的平面中的的灰线方向找到一个时间u,再在另一个方向,也就是蓝色线上找到一个时间v,就可以找到对应的曲面上的点的位置,这也是为什么贝塞尔曲面是显式表示的原因,因为这也是通过参数映射定义的。

参考:

Lecture 11 Geometry 2 (Curves and Surfaces)_哔哩哔哩_bilibili

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABB机械臂和RobotStudio编程简介

ABB机械臂和RobotStudio编程简介机械臂ABB机械臂ABB示教器RobotStudio与编程简介RobotStudio简介与安装RobotStudio使用RAPID程序指令机械臂 一种能够进行编程并在自动控制下执行某些操作和 移动作业任务的机械装置。 —— 美国国家标准局(NSB) 一种用于移动各种材料、零部件、…

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

家政服务小程序实战开发教程017-我的页面未注册功能开发

顾客在家政服务小程序可以在线提交预约信息,预约成功后可以查看订单的进度。我们本篇就来实现一下我的页面的功能。 1 新建页面 进入编辑器,在组件页面区域点击号,创建我的页面 2 未登录页面开发 我的页面的逻辑是如果用户未注册&#…

【MyBatisPlus】一文带你快速上手MyBatisPlus

文章目录MyBatisPlus学习笔记前言1、MyBatisPlus概述2、快速体验3、CRUD接口3.1 Mapper层CRUD接口3.1.1 Insert3.1.2 Delete3.1.3 Update3.1.4 Select3.2 Service层CRUD接口3.2.1 Save3.2.2 Remove3.2.3 Update3.2.4 Get3.3 自定义SQL接口4、常用注解和配置4.1 TableId4.2 Tabl…

【C++】模板进阶(非类型模板参数、类模板的特化和模板的分离编译)

之前我们讲解过模板初阶,没有阅读过的童鞋可以先去阅读之前的博文----->模板初阶 本章我们将针对模板进行进一步的讲解。 目录 (一)非类型模板参数 (二)模板的特化 (1)概念 &#xff0…

我的面试八股(Java集合篇)

Java集合 两个抽象接口派生:一个是Collection接口,存放单一元素;一个是Map接口存放键值对。 Vector为什么是线程安全 简单,因为官方在可能涉及到线程不安全的操作都进行了synchronized操作,就自身源码就给你加了把锁。 Vector…

Stacking:解决机器学习进行多模型组合的实用工具

文章目录1 Stacking原理第一步:生成预测结果第二步:整合预测结果2 使用Python实现Stacking第一步:生成预测结果第二步:整合预测结果借助sklearn实现stacking3 各领域内的一些实际应用在机器学习领域,算法的选择和参数的…

前端--文件上传--文件切片--利用FileReader()中的readAsDataURL()做缩略图--多文件上传--formData--切片上传实现

一、文件上传 <template><div><input type"file" name"file" change"fileChange" /><button click"submit">提交</button></div> </template><script setup>function fileChange(e)…

ROS开发之如何制作launch启动文件?

文章目录0、引言1、Launch文件语法2、Launch示例0、引言 笔者因研究课题涉及ROS开发&#xff0c;学习了古月居出品的ROS入门21讲&#xff0c;为巩固launch的知识&#xff0c;本文将ROS的launch启动文件制作一讲内容进行总结。launch文件通过XML文件实现多节点的配置和启动&…

Compose (11/N) - 手势

一、点击 1.1 可点击 Modifier.clickable( ) 允许应用检测对该元素的点击。 Composable fun ClickableSample() {val count remember { mutableStateOf(0) }Text(text count.value.toString(),modifier Modifier.clickable { count.value 1 }) } 1.2 手势检测 Modifier.p…

【技术分享】接口自动化测试中,如何做断言验证?

在服务端自动化测试过程中&#xff0c;发起请求之后还需要对响应值进行验证。验证响应信息符合预期值之后&#xff0c;这一条接口自动化测试用例才算完整的通过。所以这一章节&#xff0c;将会讲解在接口自动化测试中&#xff0c;如何对服务端返回的响应内容做断言验证。 实战…

C语言函数大全-- i 开头的函数

C语言函数大全 本篇介绍C语言函数大全– i 开头的函数 1. imagesize 1.1 函数说明 函数声明函数功能unsigned imagesize(int left, int top, int right, int bottom);获取保存位图像所需的字节数 1.2 演示示例 #include <graphics.h> #include <stdlib.h> #in…

【Java数据结构】链表OJ提交小记

目录 1.删除链表中所有值为val的节点 2.反转单链表 3.返回链表的中间节点 4.返回链表倒数第k个节点 5.按次序合并链表 6.按值分割链表 7.判断链表是否为回文 1.删除链表中所有值为val的节点 1. 删除链表中所有值为val的节点https://leetcode.cn/problems/remove…

考研数据结构-绪论

绪论 文章目录绪论1. 什么是数据结构2. 基本概念数据结构的四类基本结构&#xff08;逻辑结构&#xff09;存储结构顺序存储和链式存储比较分析3. 算法概念特征优点&#xff08;也是要求&#xff09;算法效率的度量概念时间复杂度空间复杂度(了解)1. 什么是数据结构 数据结构是…

【Python】字符串 ⑦ ( input 字符串输入 | input 函数自带提示参数 | input 函数接收的变量类型 )

文章目录一、input 字符串输入二、代码示例三、input 函数自带提示参数四、input 函数接收的变量类型一、input 字符串输入 在命令行中 , 使用 printf 可以输出数据 , 将 变量 , 字面量 , 表达式 输出到命令行中 ; 在命令行中 , 使用 input 语句可以 在 命令行 中 , 从键盘获取…

2023年第五届传智杯前四题题解(后俩没写出来)

比赛链接&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;决赛B组&#xff09; - 比赛详情 - 洛谷 时效「月岩笠的诅咒」 题目背景 蓬莱之药&#xff0c;被诅咒的不死之药。 奉命将蓬莱之药投入富士山中销毁的月岩笠&#xff0c;最终打算把蓬莱之药改投入八岳销…

STM32Cube的debug和release切换

一&#xff0c; Debug / Release版本区别 来源&#xff1a;STM32CUBEIDE中 Debug 和 Release 的作用/区别/使用场景 - svchao - 博客园 (cnblogs.com) 二&#xff0c;Debug / Release使用。 1&#xff0c;在编译的时候可以选择Debug 还是 Release . 2,使用stm32CubeIDE调试或运…

【模型复现】resnet,使用net.add_module()的方法构建模型。小小的改进大大的影响,何大神思路很奇妙,基础很扎实

从经验来看&#xff0c;网络的深度对模型的性能至关重要&#xff0c;当增加网络层数后&#xff0c;网络可以进行更加复杂的特征模式的提取&#xff0c;所以当模型更深时理论上可以取得更好的结果。但是更深的网络其性能一定会更好吗&#xff1f;实验发现深度网络出现了退化问题…

Git的安装与基本使用

Git是一个分布式版本控制工具&#xff0c;可以快速高效地处理从小型到大型的各种项目。 1.Git的安装 官网下载地址 &#xff1a;https://git-scm.com/ 安装过程 选择 Git 安装位置&#xff0c;要求是非中文并且没有空格的目录&#xff0c;然后下一步。 Git 选项配置&#xf…

ChatGPT搭建语音智能助手

环境 python&#xff1a;3 ffmpeg:用于处理视频和语音 gradio:UI界面和读取语音 概述 我们的目的是做一个语音智能助手 下面我们开始 准备工作 下载Visual Studio Code Visual Studio Code 因为需要写python代码&#xff0c;用Visual Studio Code比较方便。 安装pytho…