结论

最近在研究3次样条曲线。曲线由四个控制点控制,依次记为P0,P1,P2,P3。在绘制Hermite曲线的时候,发现如果令P0处的导数为3倍P1-P0,P3处的导数为3倍P3-P2,则P0,P1,P2,P3构成的Hermite曲线与P0,P1,P2,P3构成的Bezier曲线完全相同。

下面详细分析说明这一点

分析

通用的三次Hermite曲线的参数表达式为

P(u)=P0(2u3−3u2+1)+P3(−2u3+3u2)+P0′(u3−2u2+u)+P3′(u3−u2)P(u)=P_0(2u^3-3u^2+1)+P_3(-2u^3+3u^2)+P'_0(u^3-2u^2+u)+P'_3(u^3-u^2)P(u)=P0​(2u3−3u2+1)+P3​(−2u3+3u2)+P0′​(u3−2u2+u)+P3′​(u3−u2)

刚刚我们说明了,如果P0′=3(P1−P0)P'_0=3(P_1-P_0)P0′​=3(P1​−P0​),P3′=3(P3−P2)P'_3=3(P_3-P_2)P3′​=3(P3​−P2​),那么上式又可以化为
P(u)=(u3−3u2+1)P0+(−2u3+3u2)P3+3(P1−P0)(u3−2u2+u)+3(P3−P2)(u3−u2)P(u)=(u^3-3u^2+1)P_0+(-2u^3+3u^2)P_3+3(P_1-P_0)(u^3-2u^2+u)+3(P_3-P_2)(u^3-u^2)P(u)=(u3−3u2+1)P0​+(−2u3+3u2)P3​+3(P1​−P0​)(u3−2u2+u)+3(P3​−P2​)(u3−u2)
整理一下可以得到
P(u)=(1−3u+3u2−u3)P0+(3u−6u2+3u3)P1+(3u2−3u3)P2+u3P3P(u)=(1-3u+3u^2-u^3)P_0+ (3u-6u^2+3u^3)P_1+(3u^2-3u^3)P_2+u^3P_3P(u)=(1−3u+3u2−u3)P0​+(3u−6u2+3u3)P1​+(3u2−3u3)P2​+u3P3​
P(u)=(1−u)3P0+3u(1−u)2P1+3u2(1−u)P2+u3P3P(u)=(1-u)^3P_0+3u(1-u)^2P_1+3u^2(1-u)P_2+u^3P_3P(u)=(1−u)3P0​+3u(1−u)2P1​+3u2(1−u)P2​+u3P3​

这正是三次Bezier曲线的公式

Demo演示

下面用OpenCV分别画Hermite曲线和Bezier曲线,两条曲线完全重合。

Demo演示代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <cmath>using namespace std;
using namespace cv;string mainwindow = "构造线";Point2d control_points[4];
int control_points_index = 0;int height = 600;
int width = 800;Mat screen_mat;const double CHOOSE_THRESHOLD = 20;bool choose_flag = false;
int choose_point;const int LINE_N = 1000;      // 线段的个数,点数为LINE_N+1void on_mouse_handler(int event, int x, int y, int flag, void* param)   /* x, y 的原点在左上角 */
{double dist;if (event == EVENT_LBUTTONDOWN){if (control_points_index < 4){control_points[control_points_index].x = x;control_points[control_points_index].y = y;control_points_index++;}else{for (int i = 0; i < 4; i++){dist = (control_points[i].x - x) * (control_points[i].x - x) + (control_points[i].y - y) * (control_points[i].y - y);if (dist < CHOOSE_THRESHOLD * CHOOSE_THRESHOLD){//cout << "Choose " << i << endl;choose_flag = true;choose_point = i;return;}}}}else if (event == EVENT_LBUTTONUP){choose_flag = false;}else if (event == EVENT_MOUSEMOVE){if (choose_flag){control_points[choose_point].x = x;control_points[choose_point].y = y;}}
}void imag_update()
{screen_mat = Mat::zeros(height, width, CV_8UC4);for (int i = 0; i < control_points_index; i++){drawMarker(screen_mat, control_points[i], Scalar(0, 0, 255, 255), MARKER_STAR, 5);}if (control_points_index == 4){Point2d v0, v1, v2, v3;Point2d bv0, bv1, bv2, bv3;//Hermitev0 = control_points[0];v1 = control_points[3];v2 = control_points[1] - control_points[0];v3 = control_points[3] - control_points[2];v2 = 3 * v2;v3 = 3  * v3;//Bezierbv0 = control_points[0];bv1 = control_points[1];bv2 = control_points[2];bv3 = control_points[3];Point2d p0 = control_points[0];Point2d bp0 = control_points[0];Point2d p1;Point2d bp1;double u;double c0, c1, c2, c3;double bc0, bc1, bc2, bc3;for (int i = 1; i < LINE_N; i++){u = i * 1.0 / LINE_N; c0 = 2 * u * u * u - 3 * u * u + 1;c1 = -2 * u * u * u + 3 * u * u;c2 = u * u * u - 2 * u * u + u;c3 = u * u * u - u * u;//Bezierbc0 = (1 - u) * (1 - u) * (1 - u);bc1 = 3 * u * (1 - u) * (1 - u);bc2 = 3 * u * u * (1 - u);bc3 = u * u * u;p1.x = v0.x * c0 + v1.x * c1 + v2.x * c2 + v3.x * c3;p1.y = v0.y * c0 + v1.y * c1 + v2.y * c2 + v3.y * c3;bp1.x = bv0.x * bc0 + bv1.x * bc1 + bv2.x * bc2 + bv3.x * bc3;bp1.y = bv0.y * bc0 + bv1.y * bc1 + bv2.y * bc2 + bv3.y * bc3;line(screen_mat, p0, p1, Scalar(0, 0, 255, 128), 1, LINE_AA);line(screen_mat, bp0, bp1, Scalar(0, 255, 0, 128), 1, LINE_AA);p0 = p1;bp0 = bp1;}}imshow(mainwindow, screen_mat);
}void window_initialize()
{namedWindow(mainwindow, WINDOW_AUTOSIZE);setMouseCallback(mainwindow, on_mouse_handler);
}void main_loop()
{/* Endless loop until ESC key pressed*/bool finished = false;int pressed_key = 0;while (!finished){imag_update();pressed_key = waitKey(10);if (pressed_key == 27) finished = true;}
}int main()
{window_initialize();main_loop();return 0;
}

Hermite曲线与Bezier曲线的关系相关推荐

  1. Bezier曲线的构建

    Bezier曲线是由法国雷诺汽车公司的P.E.Bezier于20世纪70年代初为解决汽车外型设计而提出的一种新的参数表示法,这种方法的特点是:控制点的输入与曲线输出之间的关系明确,使设计人员比较直观地 ...

  2. qt下bezier曲线的绘制(C++)

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  3. Bezier曲线简介

    Bezier曲线简介 Bezier曲线,又有人叫贝赛尔曲线,贝兹曲线,在计算机绘图中经常被用到,由于前些天事件要用到这个,所以就研究了下. 有了参考资料,其实也不是很复杂. 曲线的介绍(转自维基百科, ...

  4. Bezier曲线及其性质

    本文为Bezier曲线mooc教程学习笔记. 目录 Bezier曲线与曲面 [1] Bezier曲线的背景 [2] Bezier曲线 [3] Bezier曲线详细定义 [4] Bezier曲线举例 [ ...

  5. Bezier曲线描述

    Bezier曲线 1.Bezier曲线的定义 当用曲线段拟合曲线f(x)时,可以把曲线表示为许多小线段φi(x)之和,其中φi(x)称为基(混合)函数. 这些基(混合)函数是要用于计算和显示的.因此, ...

  6. android曲线位移动画,Bezier曲线在Android动画中的应用

    Android动画的开发中,为了达到更加酷炫的效果,常常需要自定义运动轨迹,或者绘制花式复杂的曲线,这正是Bezier曲线大显神通的地方,本文将带你了解Bezier曲线在Android开发中的一些应用 ...

  7. 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》

    计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...

  8. 曲线数学NURBS之bezier曲线

    最近新研究topic是NURBS,NURBS(Non Uniform Rational B-spline)即非均匀有理B样条曲线.往往提到B样条.以及NURBS就会提到bezier曲线,他们之间的关系 ...

  9. [摘抄] Bezier曲线、B样条和NURBS

    Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...

最新文章

  1. WEB前端开发的思考与感悟
  2. java 大数据处理一
  3. 一个页面同时发起多个ajax请求,会出现阻塞情况
  4. 进击的新势力·95后短视频冲浪与消费图鉴2021
  5. java中for的增强用法,Java中增强for循环的用法
  6. 写了一年的博客,我收获了什么
  7. 【报告分享】GitHub 2020数字洞察报告.pdf(附下载链接)
  8. c++容器vector介绍
  9. 「手把手带你学算法」本周小结!(贪心算法系列三)
  10. byte拷贝java_Java字节流实现文件夹的拷贝
  11. R-CNN算法优化策略
  12. SSO单点登录系统的设计与实现
  13. Graphene图数据建模工具
  14. TSCA你了解多少?什么产品需要做TSCA认证
  15. 牛客网剑指offer(Python版)
  16. 什么是随机对照双盲实验
  17. 跳槽次数有点多,简历该这样写!
  18. BIM技术应用-成都绿地蜀峰-超高层(附方案文本86页)
  19. 常见的U盘数据丢失问题及U盘数据恢复教程?
  20. 前端javascript QQ右下角弹窗

热门文章

  1. 更新ubuntu软件源
  2. JSP 和 Servlet 区别
  3. 在WinCE 6.0系统下实现USB功能定制
  4. python模拟地面网管接收数据
  5. Java并发编程实战系列15之原子遍历与非阻塞同步机制(Atomic Variables and Non-blocking Synchronization)...
  6. ASP.NET夜话笔记06
  7. suse linux 光纤卡重置,SUSE Linux下查看光纤卡号和操作系统的版本
  8. 利用树求解算术表达式的值
  9. 【知识发现】基于物品的协同过滤推荐算法python实现
  10. 分布式发布订阅消息系统Kafka单实例测试