挖一挖贝塞尔曲线那些事(一)

简介: 挖一挖贝塞尔曲线那些事

一、前世今生

     贝塞尔曲线的最初设计是服务于工业设计,尤其应用与汽车曲线设计。随着计算机画图的应用广泛,若想在计算机上画出平滑精准的曲线并不是一件容易的事,贝塞尔曲线解决了这样的问题,贝塞尔虚线通过起始点与结束点来确定曲线的首尾,通过若干个控制点来确定曲线的走向。由于其由法国工程师皮埃尔·贝塞尔广泛推广,因此这种曲线被命名为贝塞尔曲线。

二、数学基础

     平面上的任意连续曲线可以通过伯恩斯坦多项式来进行逼近拟合,因此,当我们想在平面中画一条曲线的时候,如果可以模拟出此曲线的函数,则可以十分精准的控制计算机来描绘一系列曲线上的点来绘制曲线。贝塞尔曲线就是基于这样的数学基础。

     首先,对于一条贝塞尔曲线,其3要素分别是:起始点,结束点和控制点。其中曲线的起点在起始点,终点在结束点,曲线并不穿过控制点,控制点来掌握曲线的走向,控制点个数可以不定。

1、一阶贝塞尔曲线

     一阶贝塞尔曲线控制点的个数为0,只有起始点与结束点。其实一阶贝塞尔曲线就是一条从起始点到结束点的直线段。其公式如下:

image.png


上面公式中,P为曲线上的点,P0为起始点,P1为结束点。(对于平面上的点,分别用上面公式计算x,y坐标即可)。由于其公式为线性公式,所有这种贝塞尔曲线也被称为一阶贝塞尔曲线。下图可以很好的描述当t从0到1变化时,线段的绘制过程:


image.png

2、二阶贝塞尔曲线

     二阶贝塞尔曲线有一个控制点,假设起始点,控制点和结束点分别为P0、P1、P2。连接P0P1,P1P2,在区间0-1之间,在P0P1线段上取点M,在P1P2线段上取点N,使得P0M/P0P1=P1N/P1P2,找到线段MN上一点Q,同时使得MQ/QN=P0M/P0P1=P1N/P1P2,所有Q点的集合即为所求贝塞尔曲线。上面的描述有些抽象,使用数学推导就义一目了然了,公式推导如下:

image.png

image.png


绘图过程如下:

image.png

3.高阶贝塞尔曲线

     有了一阶与二阶的基础,高阶贝塞尔曲线也是通过相同的方式来推导,一个通用的递推公式如下:

image.png

三阶和四阶的绘制过程演示如下:

image.png


目录
相关文章
|
存储 算法 Java
操作系统之存储管理——FIFO算法和LRU算法
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
1242 0
操作系统之存储管理——FIFO算法和LRU算法
|
消息中间件 Kafka 数据处理
超硬核解析!Apache Hudi灵活的Payload机制
Apache Hudi 的Payload是一种可扩展的数据处理机制,通过不同的Payload我们可以实现复杂场景的定制化数据写入方式,大大增加了数据处理的灵活性。Hudi Payload在写入和读取Hudi表时对数据进行去重、过滤、合并等操作的工具类,通过使用参数 "hoodie.datasource.write.payload.class"指定我们需要使用的Payload class。 ​
2468 0
超硬核解析!Apache Hudi灵活的Payload机制
|
数据可视化
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
1771 0
WGCNA 简明指南|2. 模块与性状关联分析并识别重要基因
|
自然语言处理 PyTorch 算法框架/工具
离线解耦的文本表征方法(持续更新ing...)
本文仅介绍离线、解耦的、直接对文本进行表征的方法。分成通过词嵌入池化得到句子嵌入,和直接进行句子嵌入两种做法。主要用PyTorch实现。 本文将使用一个数据集来撰写相应代码,并使用简单的线性分类器来实现multi-class文本分类,分类模型的代码(我每个都是跟前面的文本表征部分直接写在同一个脚本里的)和各表征方法的效果在第4节展示。 本文使用的分词方式是jieba默认模式。其他注意事项看具体各分节内容。
离线解耦的文本表征方法(持续更新ing...)
|
算法 IDE 编译器
Qt开发笔记之线性代数:线性代数矩阵以及Eigen库的介绍、编译和使用
Qt开发笔记之线性代数:线性代数矩阵以及Eigen库的介绍、编译和使用
Qt开发笔记之线性代数:线性代数矩阵以及Eigen库的介绍、编译和使用
|
机器学习/深度学习 人工智能 算法
图解机器学习 | 逻辑回归算法详解
逻辑回归简单有效且可解释性强,是机器学习领域最常见的模型之一。本文讲解逻辑回归算法的核心思想,并讲解sigmoid函数、梯度下降、解决过拟合、线性/非线性切分等重要知识点。
1109 1
图解机器学习 | 逻辑回归算法详解
|
Kubernetes Cloud Native 应用服务中间件
【云原生 | 从零开始学Kubernetes】四、Kubernetes之YAML文件详解
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种文件叫做资源清单文件,通过kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。一般在我们开发的时候,都是通过配置YAML文件来部署集群的。
547 0
【云原生 | 从零开始学Kubernetes】四、Kubernetes之YAML文件详解
|
数据采集 运维 Ubuntu
|
存储 机器学习/深度学习 人工智能
|
缓存 Linux 网络安全
Docker 运行时的用户与组管理
docker 以进程为核心, 对系统资源进行隔离使用的管理工具. 隔离是通过 cgroups (control groups 进程控制组) 这个操作系统内核特性来实现的. 包括用户的参数限制、 帐户管理、 资源(CPU,内存,磁盘I/O,网络)使用的隔离等. docker 在运行时可以为容器内进程指定用户和组. 没有指定时默认是 root .但因为隔离的原因, 并不会因此丧失安全性. 传统上, 特定的应用都以特定的用户来运行, 在容器内进程指定运行程序的所属用户或组并不需要在 host 中事先创建.
3349 0
Docker 运行时的用户与组管理