非有理 B 样条曲线插值方法——给定点数据的局部抛物线插值(可进行封闭曲线插值)

一、局部曲线插值预备知识

给定 { Q k } ( k = 0 , 1 , ⋯ , n ) \{\pmb Q_k\}(k=0,1,\cdots,n) {Qk}(k=0,1,,n),局部曲线插值是指创建 n n n 条多项式或有理曲线段: C i ( u ) ( i = 0 , 1 , ⋯ , n − 1 ) \pmb C_i(u)(i=0,1,\cdots,n-1) Ci(u)(i=0,1,,n1),要求相邻曲线段在连接点处满足事先指定的连续阶,采用多项式构造每个曲线段,然后选择一个合适的节点矢量得到 B 样条曲线。

为了生成 B 样条曲线段 C i ( u ) \pmb C_i(u) Ci(u),需要计算内控制点:二次的有一个;三次的有两个。这些控制点都在与曲线相切于 Q k \pmb Q_k Qk 点的直线上,因此我们需要知道每一个 Q k \pmb Q_k Qk 处的切向矢量 T k \pmb T_k Tk
q k = Q k − Q k − 1 V k = ( 1 − α k ) q k + α k q k + 1 T k = V k ∣ V k ∣ (1) \begin{aligned} &\pmb{q}_k=\pmb Q_k-\pmb Q_{k-1}\\[2ex] &\pmb{V}_k=(1-\alpha_k)\pmb q_k+\alpha_k\pmb q_{k+1}\\[1ex] &\pmb T_k = \frac{\pmb V_k}{\mid\pmb V_k\mid} \end{aligned}\tag{1} qk=QkQk1Vk=(1αk)qk+αkqk+1Tk=VkVk(1)

其中, T \pmb T T 表示单位长度切矢量。插值参数 α k \alpha_k αk 的计算方法如下(五点法):
α k = ∣ q k − 1 × q k ∣ ∣ q k − 1 × q k ∣ + ∣ q k + 1 × q k + 2 ∣ , k = 2 , ⋯ , n − 2 (2) \alpha_k=\frac{\mid\pmb q_{k-1}\times\pmb q_k\mid}{\mid\pmb q_{k-1}\times\pmb q_k\mid+\mid\pmb q_{k+1}\times\pmb q_{k+2}\mid},\quad k=2,\cdots,n-2\tag{2} αk=qk1×qk+qk+1×qk+2qk1×qk,k=2,,n2(2)

需要注意的是:当(2)式分母为 0 意味着要么 Q k \pmb Q_k Qk 是一个角点,要么 Q k − 2 \pmb Q_{k-2} Qk2 Q k + 2 \pmb Q_{k+2} Qk+2 是一条直线段。在这种情况下, α k \alpha_k αk 的值有多种选择方式,可以按如下方式选取:

  • α k = 1 \alpha_k=1 αk=1,这时有 V k = q k + 1 \pmb V_k=\pmb q_{k+1} Vk=qk+1;它会在 Q k \pmb Q_k Qk 处产生一个角点(当希望在 Q k \pmb Q_k Qk 处保留角点时);
  • α k = 1 2 \alpha_k=\dfrac{1}{2} αk=21,有 V k = 1 2 ( q k + q k + 1 ) \pmb V_k=\dfrac{1}{2}(\pmb q_k+\pmb q_{k+1}) Vk=21(qk+qk+1);这种选择将会消除掉角点(使其变光滑)(当不希望保留角点时)。

需要对端点处进行特殊的处理:
q 0 = 2 q 1 − q 2 , q − 1 = 2 q 0 − q 1 , q n + 1 = 2 q n − q n − 1 , q n + 2 = 2 q n + 1 − q n (3) \pmb q_0=2\pmb q_1-\pmb q_2,\quad \pmb q_{-1}=2\pmb q_0-\pmb q_1,\quad \pmb q_{n+1}=2\pmb q_n-\pmb q_{n-1},\quad\pmb q_{n+2}=2\pmb q_{n+1}-\pmb q_n\tag{3} q0=2q1q2,q1=2q0q1,qn+1=2qnqn1,qn+2=2qn+1qn(3)

将(3)式代入(1)式和(2)式,即可得到端点处的切矢 T 0 , T 1 \pmb T_0,\pmb T_1 T0,T1 T n − 1 , T n \pmb T_{n-1},\pmb T_n Tn1,Tn

def TangentialVector(Q, flag):"""计算数据点 Q 每一点处的切矢:param Q: 数据点:param flag: 0:保留角点;1:消除角点:return: 切矢 T""""q_k = Q_k - Q_{k-1}  q 的下标为 -1 ~ n+2"n = Q.shape[1] - 1  # 数据点 Q 的最大下标q = np.zeros((Q.shape[0], n + 3))  # q 应该有 n + 4 个列元素,缺少一个 q[-1] 为了统一下标,后续会额外增加一个 q_neg"计算 q[1]~q[n]"for i in range(1, n + 1):  # 计算q[:, i] = Q[:, i] - Q[:, i - 1]q[:, 0] = 2 * q[:, 1] - q[:, 2]  # q[0]q[:, n + 1] = 2 * q[:, n] - q[:, n - 1]  # q[n+1]q[:, n + 2] = 2 * q[:, n + 1] - q[:, n]  # q[n+2]q_neg = 2 * q[:, 0] - q[:, 1]  # q[-1]"五点法计算插值参数 alpha[k]"V = np.zeros((Q.shape[0], n + 1))T = np.zeros((Q.shape[0], n + 1))alpha = np.zeros(n + 1)for k in range(1, n + 1):down = np.linalg.norm(np.cross(q[:, k - 1], q[:, k])) + np.linalg.norm(np.cross(q[:, k + 1], q[:, k + 2]))up = np.linalg.norm(np.cross(q[:, k - 1], q[:, k]))if down == 0:  # Q[k] 是一个角点,或者,Q[k-2] 到 Q[k+2] 是一条直线段if flag == 0:  # 保留角点V[:, k] = q[:, k + 1]T[:, k] = V[:, k] / np.linalg.norm(V[:, k])elif flag == 1:  # 消除角点V[:, k] = (q[:, k] + q[:, k + 1]) / 2T[:, k] = V[:, k] / np.linalg.norm(V[:, k])else:print("参数 flag 输入错误")else:alpha[k] = up / downV[:, k] = (1 - alpha[k]) * q[:, k] + alpha[k] * q[:, k + 1]T[:, k] = V[:, k] / np.linalg.norm(V[:, k])parm_up = np.linalg.norm(np.cross(q_neg, q[:, 0]))parm_down = (np.linalg.norm(np.cross(q_neg, q[:, 0])) + np.linalg.norm(np.cross(q[:, 1], q[:, 2])))if parm_down == 0:  # Q[k] 是一个角点,或者,Q[k-2] 到 Q[k+2] 是一条直线段if flag == 0:  # 保留角点V[:, 0] = q[:, 1]T[:, 0] = V[:, 0] / np.linalg.norm(V[:, 0])elif flag == 1:  # 消除角点V[:, 0] = (q[:, 0] + q[:, 1]) / 2T[:, 0] = V[:, 0] / np.linalg.norm(V[:, 0])else:print("参数 flag 输入错误")else:alpha[0] = parm_up / parm_downV[:, 0] = (1 - alpha[0]) * q[:, 0] + alpha[0] * q[:, 1]T[:, 0] = V[:, 0] / np.linalg.norm(V[:, 0])return T

二、局部抛物线插值

给定 x y xy xy 平面上的点 { Q k } , k = 0 , 1 , ⋯ , n \{\pmb Q_k\},k=0,1,\cdots,n {Qk},k=0,1,,n,用上一节的方法来计算相应的 { T k } \{\pmb T_k\} {Tk}。用 L k L_k Lk 表示由 ( Q k , T k ) (\pmb Q_k,\pmb T_k) (Qk,Tk) 定义的有向直线,用 R k \pmb R_k Rk 表示 L k − 1 L_{k-1} Lk1 L k L_k Lk 的交点
R k = Q k − 1 + γ k − 1 T k − 1 , R k = Q k + γ k T k (4) \pmb R_k=\pmb Q_{k-1}+\gamma_{k-1}\pmb T_{k-1},\pmb R_k=\pmb Q_k+\gamma_k\pmb T_k\tag{4} Rk=Qk1+γk1Tk1,Rk=Qk+γkTk(4)

这里需要保证
γ k − 1 > 0 , γ k < 0 (5) \gamma_{k-1}>0,\quad\gamma_k<0\tag{5} γk1>0,γk<0(5)

这样才能保证沿着切矢方向上存在交点。(稍后会补充不满足该条件时如何求 R k \pmb R_k Rk

p p p 次贝塞尔曲线是定义在 U = { 0 , ⋯ , 0 , 1 , ⋯ , 1 } U=\{0,\cdots,0,1,\cdots,1\} U={0,,0,1,,1}(没有内节点)上的 B 样条曲线,则端点处的一阶导矢计算公式如下所示:
C ′ ( 0 ) = Q 0 = p u p + 1 ( P 1 − P 0 ) C ′ ( 1 ) = Q n − 1 = p 1 − u m − p − 1 ( P n − P n − 1 ) (6) \begin{aligned} &\pmb C^\prime(0)=\pmb Q_0=\frac{p}{u_{p+1}}(\pmb P_1-\pmb P_0)\\ &\pmb C^\prime(1)=\pmb Q_{n-1}=\frac{p}{1-u_{m-p-1}}(\pmb P_n-\pmb P_{n-1}) \end{aligned}\tag{6} C(0)=Q0=up+1p(P1P0)C(1)=Qn1=1ump1p(PnPn1)(6)

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

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

相关文章

LCR 173. 点名

解题思路&#xff1a;二分法 class Solution {public int takeAttendance(int[] records) {int i 0, j records.length - 1;while(i < j) {int m (i j) / 2;if(records[m] m) i m 1;else j m - 1;}return i;} }

TCPIP协议存在的安全隐患以及对应的防范措施

TCP/IP协议&#xff0c;作为网络通信的标准协议&#xff0c;是一组不同层次上的多个协议的组合。由于在其设计初期过分强调其开放性和便利性&#xff0c;却没有认真仔细考虑到它的安全性问题&#xff0c;因此协议中存在有诸多的安全漏洞。协议缺陷造成的安全漏洞&#xff0c;很…

二叉树的链式结构实现

二叉树的链式结构实现 1. 链式存储2. 二叉树的遍历前序遍历中序遍历后序遍历 3. 二叉树遍历的代码实现前序遍历中序遍历后序遍历 4. 二叉树各种相关函数的实现二叉树节点个数二叉树叶子节点个数二叉树的高度二叉树第k层节点个数二叉树查找值为x的节点 5. 代码验证 1. 链式存储 …

东莞IBM服务器维修之IBM x3630 M4阵列恢复

记录东莞某抖音电商公司送修一台IBM SYSTEM X3630 M4文档服务器RAID6故障导致数据丢失的恢复案例 时间&#xff1a;2024年02月20日&#xff0c; 服务器品牌&#xff1a;IBM System x3630 M4&#xff0c;阵列卡用的是DELL PERC H730P 服务器用途和用户位置&#xff1a;某抖音电…

Fastapi进阶用法,路径参数,路由分发,查询参数等详解

文章目录 1、路径操作1.路径操作装饰器1.tags 标签2.summary 接口描述的总结信息3.describe: 接口信息的详细描述4.response_description&#xff1a;响应描述5.deprecated&#xff1a;接口是否废弃&#xff0c;默认是False 2.fastapi路由分发include_router 2、请求与响应2.1、…

【java-集合框架】ArrayList类

&#x1f4e2;java基础语法&#xff0c;集合框架是什么&#xff1f;顺序表的底层模拟实现都是看本篇前的基础必会内容&#xff0c;本篇不再赘述&#xff0c;详情见评论区文章。 &#x1f4e2;编程环境&#xff1a;idea 【java-集合框架】ArrayList类 1. 先回忆一下java代码中常…

泽攸科技JS系列高精度台阶仪在半导体领域的应用

泽攸科技JS系列高精度台阶仪是一款先进的自主研发的国产台阶仪&#xff0c;采用了先进的扫描探针技术。通过扫描探针在样品表面上进行微观测量&#xff0c;台阶仪能够准确获取表面形貌信息。其工作原理基于探针与样品表面的相互作用力&#xff0c;通过测量探针的微小位移&#…

JVM相关面试题

【面试题一】谈谈JVM内存模型 JVM内存区域的划分&#xff0c;之所以划分是为了JVM更好的进行内存管理。就好比一间卧室&#xff0c;这块放床&#xff0c;这块放个电脑桌&#xff0c;每块地方各自有各自的功能&#xff0c;床用来睡觉&#xff0c;电脑桌用来办公打游戏。而JVM划…

docker常用命令和环境部署详解

Docker是一个开源的容器化平台&#xff0c;它允许开发者打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。以下是Docker的一些常用命令和环境部署的详解&#xff1a; Docker常用命令&#xff1a; 查看…

C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数 在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数&#xff0c;就是在编译时C编译器会将函数体在调用内联函数的地方展开&#xff0c;从而省去了调用函数的栈帧开销&#xff0c;提高程序运行效率。 inline int Add(int a, int b) {return a b; } int …

什么是企业级服务器?

服务器在应用层次方面分为入门级服务器、工作组级服务器、部门级服务器和企业级服务器。那么什么是企业级服务器&#xff0c;具体包含哪些内容呢&#xff0c;今天小编就带领大家大概的了解一下吧&#xff01; 企业级服务器是高级服务器之一&#xff0c;服务器性能比入门级服务器…

SpringBoot源码解读与原理分析(三十三)SpringBoot整合JDBC(二)声明式事务的生效原理和控制流程

文章目录 前言10.3 声明式事务的生效原理10.3.1 TransactionAutoConfiguration10.3.2 TransactionManagementConfigurationSelector10.3.3 AutoProxyRegistrar10.3.4 InfrastructureAdvisorAutoProxyCreator10.3.5 ProxyTransactionManagementConfiguration10.3.5.1 Transactio…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

道可云元宇宙每日资讯|沙特推出世界首个国家级“元宇宙”平台

道可云元宇宙每日简报&#xff08;2024年2月27日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 沙特推出世界首个国家级“元宇宙”平台 据 Gulf News 等媒体报道&#xff0c;沙特阿拉伯文化部近日宣布上线全球首个国家级“元宇宙”平台&#xff0c;该平台由先进…

题目 1282: 公交汽车

题目描述: 一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。 没有一辆车子行驶超过10公里&#xff0c;一个顾客打算行驶n公里&#xff08;1< n< 100&#xff09;&#xff0c;它可以通过无限次的换车来完…

袁庭新ES系列12节 | Elasticsearch高级查询操作

前言 上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL&#xff08;Domain Specific Language&#xff1a;领域特定语言&#xff09;来定义查询。因此&#xff0c;我们有…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

Langchain 加载网络信息实现RAG以及UnstructuredURLLoader的使用

以下实现了从 wikipedia 加载 Android 的网页然后保存在本地的向量数据库&#xff0c;然后通过上下文发给大模型&#xff0c;让他来总结什么是android 。 from langchain_community.vectorstores import Chroma from langchain_core.prompts import ChatPromptTemplate from l…

少儿编程热潮背后的冷思考、是不是“智商税”?

在科技飞速发展的今天&#xff0c;编程已成为一项基础技能&#xff0c;如同数学和语言一样&#xff0c;被认为是未来社会的重要通行证。随之而来的是少儿编程教育的火爆&#xff0c;各种编程班、在线课程如雨后春笋般涌现&#xff0c;吸引了无数家长的目光。然而&#xff0c;这…