怎样用画笔画光滑曲线-两点三次埃尔米特插值法(转自http://blog.sina.com.cn/s/blog_a8192bdd010105rx.html)

求几点(3点以上)之间的光滑曲线是有很多办法的,如果需要曲线通过目标点,可以用经典的三次样条曲线,如果不需要曲线通过目标点,可以使用贝塞尔曲线。

例如,用三次样条曲线,只要有4点,并且确定两边界点的斜率,既可以求得通过4点的光滑曲线,曲线在各端点处有2阶光滑性。至于三次样条曲线的公式及算法,可以随便买一本《数值分析》研究一下。
但我这几天遇到的问题是,通过画笔绘制曲线时,要绘制成光滑曲线。
画笔的绘制同已知几点求光滑曲线不同,画笔要求的是实时绘制,也就是说画笔走到哪就要把光滑曲线画到哪,这里如果使用三次样条曲线,局限性就在于,以下图为例:

当画笔走到B时,只有AB两个端点,这时就要画出AB之间的曲线(实时性),而三次样条曲线要求有3点以上,这时就无法通过三次样条曲线绘制出AB之间的光滑曲线。
其实可以变通一下,在画笔走到C的时候(而不是走到B时)才画出曲线,也就是曲线和画笔的位置有一步的延迟,这样走到C的时候就可以确定ABC三点。
但是这里还存在一个问题,三次样条曲线需要制定两端点的斜率,当画笔走到C时,如果要画出ABC之间的光滑曲线,需要知道A点的斜率和C点的斜率,当画笔走到D时,需要知道B点的斜率和D点的斜率。
其实A点和B点这种(不是最后一个端点)的斜率还是可以给出的,但C点和D点这种最后一个端点的斜率缺无法给出,因为当画笔走到C时,无法确定下一个D点的位置,所以无法确定CD的斜率,也就没有办法确定C点的斜率。
也曾考虑过当画笔走到D点时再绘制前3点的曲线,但是如果这样,那么假设存在下一点E,那么走到E的时候,ABC之间的曲线已经存在,这个时候仅需要绘制CD之间的曲线,又和以开始的绘制3点之前曲线有冲突。延伸下去考虑,其实在D点以后,问题已经演变为画亮点之间光滑曲线,因此把前3个点的问题也转化为2点之间光滑曲线的问题。
可以考虑的方法是:
1、前提条件是曲线永远比画笔延迟一步(这在实际绘制过程中用户是完全察觉不到的)。
2、当走到C点时,绘制AB的曲线,走到D点时,绘制BC的曲线。
3、两点之间的光滑曲线使用“两点三次埃尔米特”公式求曲线方程。
由于两点三次埃尔米特方程也需要给定两端点的斜率,因此问题又回到求斜率的问题上。
继续思考一下,假设A点是起始点,那么画笔走到C时要绘制AB两点之间光滑曲线,需要给定A点和B点的斜率,由于A点是开始点,所以给定斜率比较麻烦(也不是不可能),可以将问题转化为起始点A的斜率等于直线AB的斜率。
那么B点的斜率是什么样呢,由图可知B点斜率介于AB斜率和BC斜率之间,所以可以近似取为AB和BC斜率的一半(AB和BC的中间线)。这样就可以通过两点三次埃尔米特公式计算出AB两点间的曲线了(实际上根据这个方法绘制的AB间为直线)。
继续走到D点,走到D点时需要绘制BC点的曲线,由于在C点时已经计算了B点斜率为AB、BC的中间线,所以B点斜率已知,同样方法可以取C点斜率为BC、CD中间线为C点斜率,这样已知BC两点斜率再通过两点三次埃尔米特公式即可求得BC之间曲线方程。
以此类推可以跟踪画笔绘制出光滑曲线。
本方法的局限性有3:
1、B点处1阶、2阶导数不连续(因为AB为直线,而BC为三次曲线),可以通过近似给得A点斜率方法弥补,不做赘述。
2、曲线始终滞后画笔一个步骤(这在实际中用户无法感觉到)。
3、由于中间端点的斜率始终取为两条相交直线的中心线,所以理论上相对于三次样条曲线不够精确(也许光滑度和曲线形状上欠佳)。
但实际根据以上思路实现之后发现基本上是感觉不到局限性的,所绘制曲线比较另人满意。
由于本人水平有限,还没有考虑出更好的方法跟踪画笔绘制出光滑曲线。也许本文提到的方法可以进一步优化。我会继续研究。

两点三次埃尔米特插值法相关推荐

  1. 【数学建模笔记】【第三讲】拉格朗日插值法,牛顿插值法,分段三次埃尔米特插值法及其MATLAB实践

    温馨提示:本文共有3748字,阅读并理解全文大概需要15-20分钟 插值算法 一.插值法的定义 1.插值函数一共有三种: 2.多项式插值法原理 3.分段插值法原理: 4.具体如何求插值函数呢? (1) ...

  2. 两点三次埃尔米特插值

    两点三次埃尔米特插值 python代码及截图 import math import numpy as np import matplotlib.pyplot as pltdef square(data ...

  3. 数学建模插值法——三次埃尔米特插值三次样本插值(笔记)

    今天学习了插值法的matlab实现. 我们接触过五种基本的插值方法,有拉格朗日插值.牛顿插值.分段线性插值.分段三次Hermite插值和样条插值(三次). 插值法在数学建模中的应用:数模比赛中,常常需 ...

  4. 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值

    插值算法   数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求 ...

  5. 【NA】埃尔米特插值法

    文章目录 埃尔米特插值法. 唯一性. 插值余项. 在Hermite插值法之前已经完成了<拉格朗日插值法>与<牛顿插值法>,前两种方法在进行插值时只要求原函数 f(x)f(x)f ...

  6. 埃尔米特插值法在MATLAB中的应用

    埃尔米特插值法 为了让插值函数能更好的和原来的函数重合,不但要求二者在节点上函数值相等,而且要求相切,对应导数也相等,甚至要求高阶导数也相等.--这类插值被称为切触插值,或埃尔米特插值,满足这种要求的 ...

  7. 分段三次埃尔米特插值

    引入: Hermite插值定义:对于一个n+1个节点的插值问题,要求在给定的节点处,插值多项式的函数值与节点的函数值相等.同时插值多项式的一阶甚至到指定高阶的导数值,也与该节点相应阶导数值相同.这样做 ...

  8. 【matlab】三次埃尔米特插值与三次样条插值的实际应用代码

    要求:完成下列这些数据的插值,并将结果保存到一个EXCEL表格中.要求至少选取两种插值方法,并对1号池中的这些指标做出插值后图像(显示在同一个图像中) Z.mat load Z.mat x=Z(1,: ...

  9. 数值分析——两点三次Hermite插值

    Lagrange插值多项式系数满足在在给定点的值为给定的值,不在给定点的值为0,而Herimte插值法更严格,要求给定点的一阶导数也相等. 问题 已知点x0,x1=121,144,对应的值y0,y1= ...

最新文章

  1. Linux篇---ftp服务器的搭建
  2. 避坑指南:数据科学家新手常犯的13个错误(附工具、学习资源链接)
  3. 棋盘游戏的人工智能(二)------剪支
  4. DPDK support for vhost-user(十四)
  5. 苏杰专访:产品创新好方向=几十年不变的需求+硬科技赋能
  6. mysql数据库优化方案_mysql数据库优化方案
  7. mysql导入100000000需要多久_mysql做千万条压测数据
  8. 美国政府继续紧盯中兴,并可能剑指华为
  9. python转js对象_将Python对象转换为PyV8的JavaScript
  10. 高斯光束复振幅分布MATLAB
  11. 八爪鱼抓取html,网页图片采集和抓取方法详解 - 八爪鱼采集器
  12. UnicodeEncodeError: ‘charmap‘ codec can‘t encode characters in position 0-1: character maps to <unde
  13. 0人报名!清华转专业20+学科无人问津引热议,网友:一切为了吃饭
  14. HTML 打印table分页
  15. 随笔-vue项目引入axios
  16. 新代系统反向间隙参数_新代系统数控机床价格_数控机床6140相关-佛山市顺德锐锋五金机械有限公司...
  17. 25867 喆神装书 (背包DP)(贪心)
  18. Sicily 1009. Mersenne Composite N
  19. Python 列表的使用
  20. Dash的安装和示例App

热门文章

  1. 微信网页长按二维码不识别问题
  2. 如何为戴尔灵越15 5559加装内存条和固态硬盘
  3. 按f5html页面变了,各位老板,十万火急!html页面radio默认选中一个按F5键不变?...
  4. php 图片上加文字,php使用GD库实现图片上添加文字的方法(代码)
  5. 2022年安徽最新食品安全管理员模拟考点及答案
  6. 使用svn时找到项目下隐藏的.svn文件夹
  7. python游戏彩蛋_用python写游戏之2D跑酷游戏(一)
  8. 中文linux(Ubuntu)下让date命令显示英语日期
  9. 数据库事务隔离标准分析
  10. 婚宴座位图html5,婚礼酒席座位该怎么安排好?婚宴座位安排图解