计算机图形学中的曲线问题——拉格朗日插值曲线绘制实践

news2024/11/9 3:54:37

拉格朗日插值曲线的绘制

限于篇幅,我们将在这篇文章中介绍拉格朗日插值曲线绘制实践,主文章链接:

GGN_2015
计算机图形学中的曲线问题

在主文章中我们已经介绍了拉格朗日插值函数的绘制方法。给定一个函数必须通过的点的集合,保证任意两点 x x x 指不同,我们就能构造出一条拉格朗日插值函数。但是函数图象作为一种特殊的曲线,有着很多的我们不想要的约束,例如:

  1. 函数曲线上每个 x x x 至多只有一个 y y y 与之对应;
  2. 函数难以描述斜率不存在的位置;

因此,假如我们先要描述一条在平面甚至空间中任意“蜿蜒”的曲线,我们需要使用参数方程的方式。我们可以把平面上的参数方程理解成一个从 R \R R 映射到 R 2 \R^2 R2 的映射,每一个自变量 t t t 对应着参数方程中的一个点对 ( X t , Y t ) (X_t, Y_t) (Xt,Yt)

拉格朗日插值曲线的表示

假设我们希望我们的曲线能够依次通过 P 1 ( x 1 , y 1 ) , P 2 ( x 2 , y 2 ) , ⋯   , P n ( x n , y n ) P_1(x_1, y_1), P_2(x_2, y_2), \cdots, P_n(x_n, y_n) P1(x1,y1),P2(x2,y2),,Pn(xn,yn),那么我们不妨定义一个这样的参数方程:
M ( t ) = P 1 ⋅ f 1 ( t ) + P 2 ⋅ f 2 ( t ) ⋯ + P n ⋅ f n ( t ) , t ∈ [ 1 , n ] (1) M(t)=P_1\cdot f_1(t)+P_2\cdot f_2(t)\cdots +P_n\cdot f_n(t), t\in[1, n] \tag{1} M(t)=P1f1(t)+P2f2(t)+Pnfn(t),t[1,n](1)

其中 f i f_i fi 的是一个在 x = i x=i x=i 处取值为 1 1 1,在 x ∈ { 1 , 2 , ⋯   , n } 且 x ≠ i x\in\{1, 2, \cdots, n\} 且 x\neq i x{1,2,,n}x=i f i ( x ) = 0 f_i(x)=0 fi(x)=0,这种函数的构造方法在主文章中介绍过,在此不再赘述。 ( 1 ) (1) (1) 式中,我们将 P i P_i Pi f i ( t ) f_i(t) fi(t) 依次对应相乘,这里的点 ‘ ⋅ \cdot ’ 表示数乘向量,其中 P i P_i Pi 是二维空间的点坐标,也就是一个二维向量, f i ( t ) ∈ R f_i(t)\in \R fi(t)R 是一个实数。最终我们得到的 M ( t ) ∈ R 2 M(t)\in \R^2 M(t)R2 是一个二维向量,我们把它视为平面中的一个动点,这个动点的轨迹就是我们的插值曲线。

根据我们之前对一般的拉格朗日插值函数的介绍,我们可以得知:
M ( 1 ) = P 1 ⋅ 1 + P 2 ⋅ 0 ⋯ + P n ⋅ 0 = P 1 M ( 2 ) = P 1 ⋅ 0 + P 2 ⋅ 1 ⋯ + P n ⋅ 0 = P 2 ⋮ M ( n ) = P 1 ⋅ 0 + P 2 ⋅ 0 ⋯ + P n ⋅ 1 = P n M(1)=P_1\cdot 1+P_2\cdot 0\cdots +P_n\cdot0=P_1\\ M(2)=P_1\cdot 0+P_2\cdot 1\cdots +P_n\cdot0=P_2\\ \vdots\\ M(n)=P_1\cdot 0+P_2\cdot 0\cdots +P_n\cdot1=P_n\\ M(1)=P11+P20+Pn0=P1M(2)=P10+P21+Pn0=P2M(n)=P10+P20+Pn1=Pn

换言之,当 t t t 1 1 1 变化到 n n n 的过程中参数方程曲线 M ( t ) M(t) M(t) 能够依次通过 P 1 , P 2 , ⋯   , P n P_1, P_2, \cdots, P_n P1,P2,,Pn 中的每一个点。下面给出了一个包含五个结点的拉格朗日插值函数的示例:

插值曲线
我们会看到,上图中红色的曲线确实忠实地穿过了 P 1 , P 2 , ⋯   , P 5 P_1, P_2, \cdots, P_5 P1,P2,,P5 这五个控制点,但是当我们改变其中一个点的坐标时,整条曲线都扭得很厉害,而这也正是插值曲线不适合做工业设计的原因。在大多数时刻我们都不仅需要曲线经过一些指定的定点,还希望曲线能在控制点变化时尽可能保持一个较为稳定的形态,否则我们将很难实现对曲线形状的自由控制。

但拉格朗日插值曲线也有它的优势,一方面他是插值曲线,能够通过指定的所有控制点,而拟合曲线只能近似通过某些控制点。另一方面就是拉格朗日插值曲线无穷阶可导连续,而这一点是一般的分段函数很难实现的。

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

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

相关文章

学习spring源码的意义是什么呢?有什么高效的源码学习方式吗?

这不是准备跳槽了,所以最近摸鱼比较多一些,老大默许了,我觉得我老大还是很好的。也在网上看了一些资料,但是,我发现很多讲解注解的时候,对于一些可以直接点击源码查看的内容讲解的占多数,但是授…

【学习笔记】《Python深度学习》第六章:深度学习用于文本和序列

文章目录1 处理文本数据1.1 单词和字符的one-hot编码1.2 使用词嵌入1.3 从原始文本到词嵌入2 循环神经网络2.1 Keras中的循环层2.2 LSTM层和GRU层2.3 实例:使用 LSTM 进行 IMDB 电影评论分类3 循环神经网络的高级用法3.1 温度预测问题3.2 准备数据3.3 基于常识、非机…

eclipse导入svn项目,项目有红色的感叹号/叉号

eclipse导入svn项目,项目左下角有红色的感叹号/叉号 1.首先调出Problems ( window -> show view-> Problems ) 查看报错信息 其次,看看Project是否开启了项目自动构建(Build Automatically) 2.根据报错信息逐一解决 3.…

【Linux内核代码分析1】Linux时间子系统及HRTIMER实现

Linux时间子系统软件架构 (1)嵌入式设备需要较好的电源管理策略。传统的linux会有一个周期性的时钟,即便是系统无事可做的时候也要醒来,这样导致系统不断的从低功耗(idle)状态进入高功耗的状态。这样的设计…

从 Nauty 数据结构出发认识群论

在阅读本文前,强烈建议有志入门群论的同学观看 3blue1brown 魔群 视频。 对于计算机方向同学,可以尝试从数据结构的角度理解。本文主要基于文档、网站 Nauty 和 Nauty 的 python binding, pynauty(github.com) 展开。 Nauty 数据结构 本小节截选自 Na…

字节跳动虚拟数字人技术与应用

导读:火山引擎正在打造完善的虚拟数字人技术和应用体系,那么火山引擎是如何定义虚拟数字人的呢?火山引擎 2D 虚拟数字人和 3D 数字人采用了怎样先进的技术?火山引擎数字人有哪些应用和前景展望?今天我们就来一起探秘火…

[附源码]计算机毕业设计基于SpringBoot的毕业生就业系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

浅谈操作系统和进程

前言 操作系统是一个软件,对下要管理硬件设备,对上要给软件运行提供稳定的运行环境。操作系统是软硬件及用户之间交互的媒介。最常见的操作系统有Windows 98,2000,xp,vista,win7,win8&#xff…

# 智慧社区管理系统-核心业务功能-04保修信息

一 后端 1:entity package com.woniu.community.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public class Repair {private int id;private String comId;private String co…

[附源码]计算机毕业设计springboot医院挂号住院管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

LeetCode 441. 排列硬币

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 441. 排列硬币 ,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 441. …

Java基于springboot+vue的游戏物品销售购物商城系统 前后端分离

随着时代和计算机的发展,出现了越来越多的网络游戏,相对应的也拥有了越来越多的玩家,这些玩家在玩了一段游戏之后,可能会有游戏交易的需求。如果直接在私下个人交易很不安全,容易被骗。为了能够让广大游戏爱好者拥有一…

.net6 web api中使用SqlSugar(MySQL数据库)

其中SqlSugar,也可以是EFcore,或者Dapper,或者其他ORM框架。 其中mysql,也可以是SqlServer,或者oracle,或者其他数据库类型。 1.首先使用vs2022建立.net6 web api 2.增加SqlSugar和MySQL依赖项。 Newton…

17.前端笔记-CSS-定位

1、为什么要定位 先看看以下这些场景是否可以用标准流或浮动实现 (1)某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子 (2)滚动窗口时,某些盒子是可以固定在屏幕某个位置的 以上这种场景使用标准…

# 智慧社区管理系统-核心业务管理-01车位收费

一 后端 1:entity package com.woniu.community.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public class CarCharge {private int id;private String payDate;//开始时间pr…

Vue 官方文档2.x教程学习笔记 1 基础 1.6 Class 与 Style 绑定 1.6.1 绑定HTML Class

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.6 Class 与 Style 绑定1.6.1 绑定HTML Class1 基础 1.6 Class 与 Style 绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求。 因为它们都是 attribute,所以我们可以用 v-b…

浅析Vue3动态组件怎么进行异常处理

Vue3动态组件怎么进行异常处理&#xff1f;下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法&#xff0c;希望对大家有所帮助&#xff01; 动态组件有两种常用场景&#xff1a; 一是动态路由&#xff1a; // 动态路由 export const asyncRouterMap: Array<RouteRecordR…

【算法】山东大学人工智能限选课实验一(八数码问题)

实验一 八数码问题 1. 题目介绍 八数码问题描述为&#xff1a;在 33 组成的九宫格棋盘上&#xff0c;摆有 8 张牌&#xff0c;每张牌都刻有 1-8 中的某一个数码。棋盘中留有一个空格&#xff0c;允许其周围的某张牌向空格移动&#xff0c;这样通过移动牌就可以不断改变棋盘布…

【实验报告NO.000001】MIT 6.858 Computer System Security - Lab 1

0x00. 一切开始之前 MIT 6.858 是面向高年级本科生与研究生开设的一门关于计算机系统安全&#xff08;secure computer security&#xff09;的课程&#xff0c;内容包括威胁模型&#xff08;threat models&#xff09;、危害安全的攻击&#xff08;attacks that compromise s…

客快物流大数据项目(九十):ClickHouse的引擎介绍和深入日志引擎讲解

文章目录 ClickHouse的引擎介绍和深入日志引擎讲解 一、引擎介绍 二、日志引擎