计算机图形学 第7章 自由曲线曲面

news2024/12/23 15:09:29

先说好,第八章不学。

目录

  • 学习目标
  • 曲线与曲面的表示形式
    • 插值与逼近
  • Bezier曲线
    • 定义
    • 一次Bezier曲线
    • 二次Bezier曲线⭐⭐⭐
    • 三次Bezier曲线⭐⭐⭐
      • 三次Bezier曲线的Bernstein基函数:
    • Bernstein基函数的性质
    • Bezier曲线的性质
  • de Casteljau算法
    • 几何作图法
    • 绘制Bezier曲线函数代码
    • de Casteljau函数代码
    • Bezier曲线的拼接
  • Bezier曲面
    • Bezier曲面的定义
    • 双三次Bezier曲面的定义
    • 双三次Bezier曲面的拼接
  • B样条曲线
    • B样条曲线的定义
    • 二次B样条曲线
    • 几何性质
    • 三次B样条曲线
      • 几何性质
    • B样条曲线的性质
    • 局部性质
    • 构造特殊的三次B样条曲线的技巧
  • B样条曲面
    • 定义
    • 双三次B样条曲面的定义
    • 双三次B样条曲面的连续性

学习目标

  • 熟练掌握三次Bezier曲线
  • 熟练掌握双三次Bezier曲面
  • 熟练掌握B样条曲线
  • 熟练掌握双三次B样条曲面

曲线与曲面的表示形式

在这里插入图片描述


插值与逼近

其实就是数学上的定义。

插值(Interpolation):当用一组数据点来指定曲线的形状时,曲线精确地通过给定的数据点且形成光滑的曲线,称为曲线的插值。

逼近(Approximation):当用一组控制点来指定曲线的形状时,曲线被每个控制点所吸引,但实际上并不经过这些控制点,称为曲线的逼近 。

插值与逼近统称为拟合(Fitting)。

在这里插入图片描述
为了保证在连接点处光滑过渡,需要满足连续性条件。
在这里插入图片描述在这里插入图片描述

Bezier曲线

定义

在这里插入图片描述
看最后的式子就行,。
在实际应用中,最常用的是三次Bezier曲线,其次是二次Bezier曲线,高次Bezier曲线一般很少使用。

void CTestView::DrawBezier()//绘制Bezier曲线
{
	CDC *pDC=GetDC();
	CPen NewPen,*pOldPen;
	NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));//曲线颜色
	pOldPen=pDC->SelectObject(&NewPen);	
	pDC->MoveTo(P[0]);
	for(double t=0.0;t<=1.0;t+=0.01)
	{		
		double x=0,y=0;
		for(int i=0;i<=n;i++)
		{
			x+=P[i].x*C(n,i)*pow(t,i)*pow(1-t,n-i);
			y+=P[i].y*C(n,i)*pow(t,i)*pow(1-t,n-i);
		}
		pDC->LineTo(Round(x),Round(y));
	}
	pDC->SelectObject(pOldPen);
	NewPen.DeleteObject();
	ReleaseDC(pDC);
}

double CTestView::C(const int &n, const int &i)//Bernstein第一项
{
	return double(Fac(n))/(Fac(i)*Fac(n-i));
}

long CTestView::Fac(int n)//阶乘函数
{
	int f;
	if(0==n||1==n)
		f=1;
	else
		f=n*Fac(n-1);
	return f;
}

//Power幂,Factorial阶乘

一次Bezier曲线

在这里插入图片描述
控制点P到底是坐标的形式还是其他表示形式目前还不知道。


二次Bezier曲线⭐⭐⭐

在这里插入图片描述
即使要拟合的是折线,Bezier曲线也是弯的。


三次Bezier曲线⭐⭐⭐

在这里插入图片描述

自由曲线:属于曲线的一种,形态变化自然,有较强的随意性,线的走向比较自由,没有明显的规律,变化比较丰富。

在这里插入图片描述

三次Bezier曲线的Bernstein基函数:

在这里插入图片描述

在区间〔0,1〕范围内,每个基函数均不为零,
说明不能使用控制多边形对曲线的形状进行局部调整,如果要改变某一控制点位置,整条曲线都将受到影响。

Bernstein基函数的性质

在这里插入图片描述

端点这里更像是起始点。

在这里插入图片描述
导函数推导过程:
在这里插入图片描述

Bezier曲线的性质

Bernstein基函数的性质决定了Bezier曲线的性质

在这里插入图片描述

p的式子参考曲线的定义部分。
推导过程:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
起始点和终止点的二阶导数分别取决于最开始的3个控制点和最后的3个控制点。
在这里插入图片描述
这个性质说明Bezier曲线在控制多边形的起点和终点上具有相同的性质

???曲线控制多边形?这里不对吧?
在这里插入图片描述
这说明Bezier曲线位于控制多边形构成的凸包之内,而且永远不会超出凸包的范围。
在这里插入图片描述

de Casteljau算法

Bezier曲线上的点,可以使用Bezier曲线方程直接计算,但使用de Casteljau递推算法则要简单的多。
在这里插入图片描述
在这里插入图片描述

几何作图法

在这里插入图片描述
在这里插入图片描述
r为递推次数,也是P的上标。

在这里插入图片描述
n是控制点P的个数减一。

在这里插入图片描述

BUT!

加粗样式
在这里插入图片描述

绘制Bezier曲线函数代码

void CTestView::DrawBezier()
{
	CDC* pDC=GetDC();
	pDC->MoveTo(P[0]);
	for(int k=0;k<=n;k++)
	{
		pt[k].x=P[k].x;
		pt[k].y=P[k].y;
	}
             for(double t=0.0;t<=1.0;t+=0.01)
	{
		deCasteljau(t,pt);
	    pDC->LineTo(Round(pp[0][n].x),Round(pp[0][n].y));
	
	}
	ReleaseDC(pDC);
}

de Casteljau函数代码

void CTestView::deCasteljau(double t,CP2 *p)
{
	for(int k=0;k<=n;k++)
	{
		pp[k][0]=p[k];
	}
	for(int r=1;r<=n;r++)//de Casteljau递推公式
	{
		for(int i=0;i<=n-r;i++)
		{ 
			pp[i][r].x=(1-t)*pp[i][r-1].x+t*pp[i+1][r-1].x;
			pp[i][r].y=(1-t)*pp[i][r-1].y+t*pp[i+1][r-1].y;
		} 
             } 
}

Bezier曲线的拼接

一条Bezier曲线往往难以描述复杂的曲面形状。这是由于增加控制多边形的顶点数,会引起Bezier曲线次数的提高,而高次Bezier曲线会带来计算上的困难。

工程中经常使用的是二次或三次Bezier曲线的拼接,要求在结合处满足一定的连续性条件。

在这里插入图片描述

拼接后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



Bezier曲面

Bezier曲面的定义

在这里插入图片描述

在这里插入图片描述

双三次Bezier曲面的定义

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
生成曲面时可以通过先固定u, 变化v得到一簇Bezier曲线;
然后固定v,变化u得到另一簇Bezier曲线,两簇曲线交织生成Bezier曲面。

双三次Bezier曲面的拼接

与Bezier拼接类似,两张双三次Bezier曲面片也可以拼接在一起。其Beizer曲面片表述如下:

**加粗样式
**

在这里插入图片描述
一般情况下,在连接处保持一阶导数连续较为困难,要求两个控制多边形中位于交点处的两条边必须共线,但设计中很难做到这一点。图7-28所示为满足G1连续性的条件的两片Bezier曲面的控制多边形。

在这里插入图片描述

B样条曲线

Bezier曲线虽然有许多优点,但也存在不足之处

  • 其一、确定了控制多边形的顶点个数为n+1个,也就确定了曲线的次数为n次;
  • 其二、控制多边形与曲线的逼近程度较差,次数越高,逼进程度越差;
  • 其三、曲线不能局部修改,调整某一控制点将影响到整条曲线,原因是Bernstein基函数在整个区间[0,1]内有支撑,所以曲线在区间内任何一点的值都将受到全部顶点的影响,调整任何控制点的位置,将会引起整条曲线的改变;
  • 其四、Bezier曲线的拼接比较复杂。

为了解决上述问题,Gordon和Riesenfeld于1972年用B样条基函数代替了Bernstein基函数,构造了B样条曲线。

先有B样条基函数再有B样条曲线。

在这里插入图片描述

B样条曲线的定义

在这里插入图片描述

二次B样条曲线

二次B样条曲线的n=2,k=0,1,2。二次B样条曲线是二次多项式 。
在这里插入图片描述
在这里插入图片描述

几何性质

在这里插入图片描述
在这里插入图片描述

其实这些都是矩阵表示,之不过在推演的时候用的算式。

三次B样条曲线

在这里插入图片描述
在这里插入图片描述

几何性质

在这里插入图片描述
在这里插入图片描述

B样条曲线的性质

在这里插入图片描述
最后一句话是细节。

在这里插入图片描述

局部性质

在B样条曲线中,n次每段B样条曲线受n+1个控制点影响,改变一个控制点的位置,最多影响n+1个曲线段,其它部分曲线形状保持不变。

构造特殊的三次B样条曲线的技巧

在这里插入图片描述
在这里插入图片描述

B样条曲面

定义

在这里插入图片描述

双三次B样条曲面的定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
双三次B样条曲面是由三次B样条曲线交织而成。曲面生成时可以先固定u, 变化v得到一簇三次B样条曲线;然后固定v,变化u得到另一簇三次B样条曲线。与三次B样条曲线相似,双三次B样条曲面一般情况下不通过控制网格的任何顶点。

双三次B样条曲面的连续性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
B样条曲线和Bezier曲线的最主要差别在于基函数不同。

Bernstein基函数是一个整体函数,而B样条基函数一个分段函数,所以B样条曲线可以进行局部控制点调整。

Bezier曲线曲面的阶次与控制多边形的顶点数有关,B样条曲线曲面的阶次可以自由决定。这样如果控制多边形顶点数超过4个时,两段三次Bezier曲线或两张双三次Bezier曲面片之间连接时就存在拼接的问题,而B样条曲线曲面可以自由地扩展到多个控制点,始终保持阶次不变,而且扩展后的分段曲线或分段曲面实现了自然连接。

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

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

相关文章

Struts2之拦截器

Struts2之拦截器1、Struts2体系架构1.1、执行流程1.2、核心接口和类1.3、流程简图2、Struts2拦截器2.1、使用拦截器的目的2.2、拦截器的简介2.3、拦截器的工作原理2.4、拦截器的使用2.4.1、创建自定义拦截器2.4.2、struts.xml中定义和配置拦截器2.4.3、Struts2默认拦截器2.4.4、…

Leetcode.2319 判断矩阵是否是一个 X 矩阵

题目链接 Leetcode.2319 判断矩阵是否是一个 X 矩阵 Rating : 1201 题目描述 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n的二维整数数组 grid&#…

ElasticSearch - 旅游酒店案例es功能实现

目录 案例 搜索与分页功能 条件过滤功能 附近的酒店功能 广告置顶功能 HotelService(es操作)总览 案例 搜索与分页功能 案例需求&#xff1a;实现旅游的酒店搜索功能&#xff0c;完成关键字搜索和分页实现步骤如下&#xff1a;1.定义实体类&#xff0c;接收前端请求实体…

微信小程序用vant自定义tabbar页面并跳转相应页面

0.前置安装 步骤一 安装 vant 组件库 npm i vant/weapp -S --production下载完后要npm构建才能使用 步骤二 修改 app.json 将 app.json 中的 "style": "v2" 去除&#xff0c;小程序的新版基础组件强行加上了许多样式&#xff0c;难以覆盖&#xff0c;不…

分布式定时任务框架选型

目录 1. 前言 2. 定时任务框架 3. 分布式任务调度系统对比 4. 和quartz框架对比 5. 综合对比 6. 总结和结论 7. 附定时任务的其他方案 1. 前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批&#xff0c;进行一天清算&#xff0c;每月1号进行上个月清…

【算法】快速排序算法原理及实现

1.什么是快速排序算法 快速排序是对冒泡排序的一种改良版&#xff0c;通过一趟排序&#xff0c;把要排序的序列分割成两个部分&#xff0c;一部分的所有数据要比另一部分的数据都小&#xff0c;然后再根据这两部分的数据来进行快速排序。以此来达到整一个数据都变成了有序序列…

AI算法创新赛-人车目标检测竞赛总结01

AI0000020摘要:人车目标检测竞赛主要考察目标检测算法与 TPU 部署推理&#xff0c;主要考察算法选型与调 优&#xff0c;面向算能 TPU 迁移部署与推理加速两项能力;主要考核目标是算法效果(mAP)与推 理性能(单张图片推理时间)。针对这些要求&#xff0c;笔者从算法选型&#xf…

【实际开发11】- 统计 / 科学计算 - 1

目录 1. sql 统计返回值为 null 时 , 赋值 为 : 0 ( return UI ) 1. 手动 null 判断 , 进行 “0” 赋值 2. XxxxVO 展示对象 , 初始化时 , 赋值默认值 ( 待优化 ) 2. 统计异常 1. 注意中间表数据的维护 ( 同步删除 / 避免手动删数据 ) 3. 精度损失 1. Java 类型 float、…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:LiveStream和LiveStreamPlayer

本文简述如何在Smobiler中使用LiveStream和LiveStreamPlayer。 LiveStream 直播推送插件 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入LiveStream和Button&#xff0c;布局如下 选中LisvStream&#xff0c;在设计器中设置Url&#xff08;需要事先准备一个视频…

【面试原型链】前端面试那些事(1)之原型链详解

【写在前面】辞旧迎新的春季佳节&#xff0c;在这里博主先祝各位看官新的一年赚钱多多&#xff0c;知识满满&#xff0c;年后谈到面试&#xff0c; 好多人在面试的时候就倒在原型链知识点上面&#xff0c;主要原因还是基本功不够扎实&#xff0c;针对以前的知识我也计划在2023年…

C语言小题,通过指向结构体变量的指针变量输出结构体变量中成员的信息。(指针结构体变量的指针)

前言&#xff1a; 此篇是针对 指针结构体变量的指针 方面的练习。 解题思路&#xff1a; 在已有的基础上&#xff0c;本题要解决两个问题&#xff1a; &#xff08;1&#xff09;怎样对结构体变量成员赋值&#xff1b; &#xff08;2&#xff09;怎样通过指向结构体变量的指针…

天云数据:Hubble数据库系统自主研发率99.62%,是真正的信创数据库

软件是新一代信息技术的灵魂&#xff0c;是数字经济发展的基础&#xff0c;是制造强国、网络强国、数字中国建设的关键支撑。2021年&#xff0c;工信部印发的《“十四五”软件和信息技术服务业发展规划》明确指出&#xff0c;要聚力攻坚基础软件&#xff0c;关键基础软件补短板…

Javascript基础复盘5

内置对象 值属性 这些全局属性返回一个简单值&#xff0c;这些值没有自己的属性和方法。 InfinityNaNundefinedglobalThis函数属性 全局函数可以直接调用&#xff0c;不需要在调用时指定所属对象&#xff0c;执行结束后会将结果直接返回给调用者。 eval()uneval()isFinite()isN…

Q-Learning以及.NET环境下的实现

Q-Learning以及.NET环境下的实现写在前面机器学习Q-Learning环境准备试题准备解题过程写在结尾写在前面 看过我的文章的朋友应该都知道&#xff0c;我之前一直在研究视觉相关的知识&#xff0c;也看了一些卷积神经网络&#xff08;CNN&#xff09;&#xff0c;深度学习相关的文…

强化学习之:价值学习Value-Based Learning

文章目录参考内容动作价值函数&#xff08;Action-value Function&#xff09;深度强化学习&#xff08;DQN&#xff09;学习目标&#xff08;Goal&#xff09;如何获得尽可能好的 Q∗(st,a)→Q^{*}(s_t, a) \rightarrowQ∗(st​,a)→ 用神经网络通过学习获得时间差分算法&…

cocos creater 3.x 开发笔记(踩坑总结)

1、cocos creater 3.x 花屏闪屏黑屏 1.1 花屏 排序是一个很简单的功能&#xff0c;但是最终的呈现却是根据不同平台提供的渲染能力来的。因此&#xff0c;在这里说明一下&#xff0c;如果遇到了 UI 渲染出错&#xff0c;花屏&#xff0c;闪屏等现象&#xff0c;首先要检查的就…

【安装合集】Mysql8.0安装 2023年1月31日 22点15分

1.鼠标右击【Mysql8.0】压缩包选择【解压到Mysql8.0】。 2. 鼠标右击【mysql-installer-community-8.0.17.0】选择【安装】 3. 勾选【I accept the license terms】然后点击【Next】。 4. 选择【Custom】然后点击【Next】。 5. 双击【MySQL Servers】 双击【MySQL Server】&am…

数据指标体系的建设思考(四)

这一篇主要介绍对数据指标体系的价值、数据指标管理平台的理解及数据分析的趋势解读。 一、数据指标体系价值 关于数据指标体系的价值&#xff0c;我想大多数从事数据工作的人员都可以感受得到&#xff0c;毕竟数据指标的输出可以通过可视化的方式&#xff08;如大屏、驾驶舱…

Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

去除 vi/vim 和 git diff 中的 ^M 问题解决办法问题现象初步分析进一步查看问题解决Source Insightdos2unixNodpadVimsed 命令综上Reference问题现象 git diff 时发现下面的情况&#xff0c;新修改的代码之处都是携带 ^M 字符&#xff0c; 初步分析 肯定是因为 Windows 和 …

推荐5款常用的有限元分析CAE软件

正如我们之前谈到的&#xff0c;计算机辅助软件有助于进行有限元分析。但是我们如何识别好的 CAE 软件呢&#xff1f;CAE 软件必须满足以下要求才能被纳入其类别使用户能够通过图形用户界面 (GUI) 创建模拟允许在模拟中测试组件&#xff0c;同时具有可自定义的环境变量协助优化…