Bezier曲线生成

法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车。一条Bezier曲线可以拟合任何数目的控制点。

公式

设\(n+1\)个控制点\(P_0,P_1……P_n\),其中$P_k=(X_k,Y_k,Z_k),0≤k≤n $

则\(n\)次Bezier曲线为:

\[P(t)=∑P_iB_{i,n}(t)\qquad 0≤t≤1
\]

其中,\(B_{i,n}(t)\)是Bernstein基函数,即

\[B_{i,n}(t)=c_n^it^i(1-t)^{n-i}\\
c_n^i=\frac {n!}{i!(n-i)!}\quad i=0,1,2\cdots n
\]

Bezier曲线的特性

在贝塞尔曲线中,只有起点和终点在曲线上

曲线在两个端点处的边界条件:

\[P(0)=P_0,P(1)=P_n
\]

证明:

\[\begin{align*}\label{}
&P(0)= ∑PiB_{i,n}(t)= ∑PiB_{i,n}(0)\\
&B_{i,n}(0)= c_n^it^i(1-t)^{n-i}=c_n^i0^i\\
&i=0时0^0=1\\
&B_{0,n}(0)=cn0=1\\
&B_{i,n}(0)=0\quad (i≠0时)\\
&∴ P(0)=P_0 \\
\end{align*}
\]

\[\begin{align*}\label{}
&P(1)= ∑P_iB_{i,n}(1)\\
&B_{i,n}(1)= c_n^i1^i(1-1)^{n-i}\\
&B_{n,n}(1)=c_n^n1^n0^0=1\quad (i=n时)\\
&B_{i,n}(1)=0\quad (i≠n时)\\
&∴P(1)=Pn
\end{align*}
\]

曲线起点的切线在头两个控制点连线上,曲线终点的切线在最后两个控制点连线上。

Bezier曲线在端点处的一阶导数值可以由控制点坐标计算:

\[ P’(0)=-nP_0+nP_1=n(P_1-P_0)\\
P’(1)=-nP_{n-1}+nP_n
\]

Bezier曲线落在控制点的凸包内(凸多边形边界)

三次Bezier曲线

三次Bezier曲线由四个控制点生成。

当n=3时,

\[\begin{align*}\label{}
&B_{i,3}(t)=c_3^it^i(1-t)^{3-i}\quad i=0,1,2,3\\
&B_{0,3}(t)=c_3^0t^0(1-t)^{3-0}=(1-t)3\\
&B_{1,3}(t)=3t(1-t)^2\\
&B_{2,3}(t)=3t^2(1-t)\\
&B_{3,3}(t)=t^3\\
\end{align*}
\]

则:

\[\begin{aligned}
P(t)= ∑P_iB_{i,3}(t)
&=P_0B_{0,3}(t)+ P_1B_{1,3}(t)+ P_2B_{2,3}(t)+ P_3B_{3,3}(t) \\
&=
\begin{bmatrix}
B_{0,3}(t) & B_{1,3}(t) & B_{2,3}(t) & B_{3,3}(t)
\end{bmatrix}
\begin{bmatrix}
P_0 \\ P_1 \\ P_2 \\ P_3
\end{bmatrix}
\\
&= \begin{bmatrix}
t^3 & t^2 &t & 1
\end{bmatrix}
\begin{bmatrix}
-1 & 3 & -3 & 1\\
3& -6 & 3 & 0\\
-3 & 3 & 0 & 0\\
1& 0& 0& 0
\end{bmatrix}
\begin{bmatrix}
P_0 \\ P_1 \\ P_2 \\ P_3
\end{bmatrix}
\end{aligned}
\]

那么,\(x(t)\)和\(y(t)\)分别为:

\[\begin{aligned}x(t) &= \begin{bmatrix} t^3 & t^2 &t & 1\end{bmatrix}\begin{bmatrix}-1 & 3 & -3 & 1\\ 3& -6 & 3 & 0\\ -3 & 3 & 0 & 0\\ 1& 0& 0& 0\end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \\x_2 \\ x_3\end{bmatrix}\end{aligned}
\]

\[\begin{aligned}
y(t)
&= \begin{bmatrix}
t^3 & t^2 &t & 1
\end{bmatrix}
\begin{bmatrix}
-1 & 3 & -3 & 1\\
3& -6 & 3 & 0\\
-3 & 3 & 0 & 0\\
1& 0& 0& 0
\end{bmatrix}
\begin{bmatrix}
y_0 \\y_1 \\y_2 \\ y_3
\end{bmatrix}
\end{aligned}
\]

Bezier曲线的Casteljau算法

给定三维空间点\(P_0,P_1,\cdots ,P_n\)以及一维标量参数\(t\),假定:

\[P_i^r(t)=(1-t)P_i^{r-1}(t)+tP_{i+1}^{r-1}(t)\qquad
\left\{\begin{matrix}
r=1,\cdots ,n\\
i=0,\cdots ,n-4
\end{matrix}\right.
\]

并且\(P_i^0(t)=P_i\)

那么\(P_i^n(t)\)即为Bezier曲线上参数\(t\)处的点

三次Bezier曲线的分割递推算法

\[P_0^1(t) = (1-t)P_0^0(t)+tP_1^0(t)
\]

\[P_1^1(t) = (1-t)P_1^0(t)+tP_2^0(t)
\]

\[P_2^1(t) = (1-t)P_2^0(t)+tP_3^0(t)
\]

曲线生成与求交—Bezier曲线的更多相关文章

  1. 曲线生成与求交—B样条曲线

    B样条曲线生成 Bezier曲线缺点:改变任一控制点的位置,将影响整条曲线的形状. B样条曲线是对Bezier曲线的改进,可进行局部控制,生成的曲线与控制多边形的外形更接近,将Bezier曲线作为一特 ...

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

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

  3. Bezier曲线的原理 及 二次Bezier曲线的实现

    原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...

  4. 实验6 Bezier曲线生成

    1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...

  5. C# 实现Bezier曲线(vs2008)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 连续bezier曲线的实现

    需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...

  7. 7.5.5编程实例-Bezier曲线曲面绘制

    (a)Bezier曲线                         (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...

  8. 简单而粗暴的方法画任意阶数Bezier曲线

    简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...

  9. python bezier 曲线

    1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...

随机推荐

  1. Istio安全-认证(istio 系列七)

    Istio安全-认证 目录 Istio安全-认证 认证策略 配置 自动mutual TLS 全局启用istio的mutual TLS STRIC模式 卸载 针对单个命名空间或负载启用mutual TL ...

  2. js:数组(创建、遍历、函数)

    1.数组 采用单个变量只能存储一个数据,数组能够存储多个数据,获取方式也比较简单.它是将一组数据存储在当个变量下的存储方式. 2.数组的创建 (1)new方式创建,不指定数组长度 <script ...

  3. antd踩坑:日期选择器的可选日期控制的问题

    有一个需求是日期选择需要加一个日期限制. 于是我兴高采烈的加上去了. // 日期可选判断方法 disabledDateFunc = current => { const { disabledDa ...

  4. Angular 的前世今生

    目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ...

  5. postman之测试集

    简单点,说话的方式简单点 步骤1:测试全部通过,哈哈~ 开玩笑! 适用场景:多组数据测试,像排比句那样,有规律,比如姓名,性别,年龄.这时候的测试要求就是这些信息与返回体的结果做比较!! 步骤1:创建 ...

  6. [jvm] -- 内存模型篇

    内存模型 JDK1.6  JDK1.8  线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) 程序计数器 线程私有 两个作用 字节码解释器通 ...

  7. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...

  8. Java基础加强笔记——测试、反射、注解

    目录 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具 ...

  9. 关于RecyclerView(二)设置EmptyView

    首先重写一个RecyclerView类 package com.onepilltest.others; import android.content.Context; import android.s ...

  10. SpringCloud系列使用Eureka进行服务治理

    1. 什么是微服务? "微服务"一词来自国外的一篇博文,网站:https://martinfowler.com/articles/microservices.html 如果您不能看 ...