Bezier曲线简介

article/2025/11/9 19:54:09

Bezier曲线简介

    Bezier曲线,又有人叫贝赛尔曲线,贝兹曲线,在计算机绘图中经常被用到,由于前些天事件要用到这个,所以就研究了下。

 

有了参考资料,其实也不是很复杂。

   

    曲线的介绍(转自维基百科,见本文的最下方)

    初一看还是有些复杂的,其实贝兹曲线的绘制方法很简单,仔细看看一阶贝赛尔曲线,

 

    一阶贝赛尔曲线上的由两个点确定  P0 和P1,当t在0--->1区间上递增时,根据式(1)

   会得到多个点的坐标,其实这些的点就是一条直线上的点。

               B(t) = (1-t)P0 + tP1--------------------------------------(1)

          即:

               B(t).x = (1-t)P0.x + tP1.x

               B(t).y = (1-t)P0.y + tP1.y

     

       二阶贝赛尔曲线由3个点确定,它可以理解成是这样的一阶贝赛尔曲线:确定该一阶贝赛尔曲线的两个点是变化的。

      这两个点(设分别为Pm,Pn)是怎样变化的呢,这两个点又分别是(P0,P1)确定的一阶贝赛尔曲线和(P1,P2)确定的一阶贝赛尔

      曲线上的点。

            于是有了2阶贝赛尔曲线的公式

            Pm(t) = (1-t)P0 + tP1

            Pn(t)  = (1-t)P1 + tP2

            B(t)  = (1-t)Pm(t) + tPn(t) = (1-t)^2 P0 + 2(1-t)tP1+ t^2P2

        以此类推可以得到3阶贝赛尔曲线,是不是很简单?

 

 

     怎样绘制是不是很简单了?    

     

     绘制3阶段贝赛尔曲线的函数,这里用VB语言实现

       '函数说明: 画3阶贝塞尔曲线,该3阶贝塞尔曲线由3个点确定(原本该三阶曲线是由4个点确定的,不过这里把中间两 个 点合为一个点)

       输入:cp,用来控制贝塞尔曲线形状的3个点形成的数组

                   PointeOnCurve()数组用来记录曲线上的点,iPointsNum该曲线上的点的数目,也就是PointOnCureve数组的大小

                    iPointsNum越大,曲线越光滑。因为该算法的实质是通过这些点的连成的直线形成曲线。

 

     Private Type POINT_User
        X As Single
        Y As Single
      End Type

        Private Sub Draw3PointBezier(cp() As POINT_User, ByRef PointOnCurve() As POINT_User, ByVal iPointsNum As Integer)

        Dim dt, t As Single

        dt = 1# /( iPointsNum-1)
        Dim i As Integer

 

    For i = 0 To iPointsNum - 1
       t = i * dt
       PointOnCurve(i).X = (1 - t) ^ 3 * cp(0).X + 3 * t * (1 - t) * cp(1).X + t ^ 3 * cp(2).X
       PointOnCurve(i).Y = (1 - t) ^ 3 * cp(0).Y + 3 * t * (1 - t) * cp(1).Y + t ^ 3 * cp(2).Y
   
        ' If (i > 0) Then
        '           Picture_1.Line (Int(PointOnCurve(i).X), Picture_1.ScaleHeight - Int(PointOnCurve(i).Y)) _
        '           -(Int(PointOnCurve(i - 1).X), Picture_1.ScaleHeight - Int(PointOnCurve(i - 1).Y))
       '              End If
      Next i

End Sub

 

 

 

 

 

 

       

     

       

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

貝茲曲線

維基百科,自由的百科全書

跳轉到: 導航, 搜尋
三次方貝茲曲線
三次方貝茲曲線

數學數值分析領域中,貝茲曲線(Bézier curve)是電腦圖形學中相當重要的參數曲線。更高維度的廣泛化貝茲曲線就稱作貝茲曲面,其中貝茲三角是一種特殊的實例。

貝茲曲線於1962年,由法國工程師皮埃爾·貝茲所廣泛發表,他運用貝茲曲線來為汽車的主體進行設計。貝茲曲線最初由 Paul de Casteljau1959年運用 de Casteljau 演算法開發,以穩定數值的方法求出貝茲曲線。

目錄

[隱藏]
  • 1 實例說明
    • 1.1 線性貝茲曲線
    • 1.2 二次方貝茲曲線
    • 1.3 三次方貝茲曲線
  • 2 一般化
    • 2.1 術語
    • 2.2 註解
  • 3 建構貝茲曲線
    • 3.1 線性曲線
    • 3.2 二次曲線
    • 3.3 高階曲線
  • 4 應用
    • 4.1 電腦繪圖
  • 5 程式範例
  • 6 有理貝茲曲線
  • 7 參閱
  • 8 參考文獻
  • 9 外部連結

[編輯] 實例說明

[編輯] 線性貝茲曲線

給定點 P0P1,線性貝茲曲線只是一條兩點之間的直線。這條線由下式給出:

/mathbf{B}(t)=/mathbf{P}_0 + (/mathbf{P}_1-/mathbf{P}_0)t=(1-t)/mathbf{P}_0 + t/mathbf{P}_1 /mbox{ , } t /in [0,1]

且其等同於線性插值

[編輯] 二次方貝茲曲線

二次方貝茲曲線的路徑由給定點 P0P1P2 的函數 B(t) 追蹤:

/mathbf{B}(t) = (1 - t)^{2}/mathbf{P}_0 + 2t(1 - t)/mathbf{P}_1 + t^{2}/mathbf{P}_2 /mbox{ , } t /in [0,1]

TrueType 字型就運用了以貝茲樣條組成的二次貝茲曲線。

[編輯] 三次方貝茲曲線

P0P1P2P3 四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始於 P0 走向 P1,並從 P2 的方向來到 P3。一般不會經過 P1P2;這兩個點只是在那裡提供方向資訊。 P0P1 之間的間距,決定了曲線在轉而趨進 P3 之前,走向 P2 方向的「長度有多長」。

曲線的參數形式為:

/mathbf{B}(t)=/mathbf{P}_0(1-t)^3+3/mathbf{P}_1t(1-t)^2+3/mathbf{P}_2t^2(1-t)+/mathbf{P}_3t^3 /mbox{ , } t /in [0,1]

現代的成象系統,如 PostScriptAsymptoteMetafont,運用了以貝茲樣條組成的三次貝茲曲線,用來描繪曲線輪廓。

[編輯] 一般化

n 階貝茲曲線可如下推斷。給定點 P0P1、…、Pn,其貝茲曲線即

/mathbf{B}(t)=/sum_{i=0}^n {n/choose i}/mathbf{P}_i(1-t)^{n-i}t^i =/mathbf{P}_0(1-t)^n+{n/choose 1}/mathbf{P}_1(1-t)^{n-1}t+/cdots+/mathbf{P}_nt^n /mbox{ , } t /in [0,1]

例如 n = 5

/mathbf{B}(t)=/mathbf{P}_0(1-t)^5+5/mathbf{P}_1t(1-t)^4+10/mathbf{P}_2t^2(1-t)^3+10/mathbf{P}_3t^3(1-t)^2+5/mathbf{P}_4t^4(1-t)+/mathbf{P}_5t^5 /mbox{ , } t /in [0,1]

如上公式可如下遞歸表達: 用 /mathbf{B}_{/mathbf{P}_0/mathbf{P}_1/ldots/mathbf{P}_n} 表示由點 P0P1、…、Pn 所決定的貝茲曲線。則

/mathbf{B}(t) = /mathbf{B}_{/mathbf{P}_0/mathbf{P}_1/ldots/mathbf{P}_n}(t) = (1-t)/mathbf{B}_{/mathbf{P}_0/mathbf{P}_1/ldots/mathbf{P}_{n-1}}(t) + t/mathbf{B}_{/mathbf{P}_1/mathbf{P}_2/ldots/mathbf{P}_n}(t)

用平常話來說,n 階的貝茲曲線,即雙 n - 1 階貝茲曲線之間的插值。

[編輯] 術語

一些關於參數曲線的術語,有

/mathbf{B}(t) = /sum_{i=0}^n /mathbf{P}_i/mathbf{b}_{i,n}(t),/quad t/in[0,1]

即多項式

/mathbf{b}_{i,n}(t) = {n/choose i} t^i (1-t)^{n-i},/quad i=0,/ldots n

又稱作 n 階的伯恩斯坦基底多項式,定義 00 = 1。

Pi 稱作貝茲曲線的控制點多邊形以帶有的貝茲點連接而成,起始於 P0 並以 Pn 終止,稱作貝茲多邊形(或控制多邊形)。貝茲多邊形的凸包(convex hull)包含有貝茲曲線。

[編輯] 註解

  • 開始於 P0 並結束於 Pn 的曲線,即所謂的端點插值法屬性。
  • 曲線是直線的充分必要條件是所有的控制點都位在曲線上。同樣的,貝茲曲線是直線的充分必要條件是控制點共線
  • 曲線的起始點(結束點)相切於貝茲多邊形的第一節(最後一節)。
  • 一條曲線可在任意點切割成兩條或任意多條子曲線,每一條子曲線仍是貝茲曲線。
  • 一些看似簡單的曲線(如)無法以貝茲曲線精確的描述,或分段成貝茲曲線(雖然當每個內部控制點對單位圓上的外部控制點水平或垂直的的距離為 4/left(/sqrt{2} -1/right)/3 時,分成四段的貝茲曲線,可以小於千分之一的最大半徑誤差近似於圓)。
  • 位於固定偏移量的曲線(來自給定的貝茲曲線),又稱作偏移曲線(假平行於原來的曲線,如兩條鐵軌之間的偏移)無法以貝茲曲線精確的形成(某些瑣屑實例除外)。無論如何,現存的啟發法通常可為實際用途中給出近似值。

[編輯] 建構貝茲曲線

[編輯] 線性曲線

線性貝茲曲線演示動畫,t in [0,1]
線性貝茲曲線演示動畫,t in [0,1]

線性貝茲曲線函數中的 t 會經過由 P0P1B(t) 所描述的曲線。例如當 t=0.25 時,B(t) 即一條由點 P0P1 路徑的四分之一處。就像由 0 至 1 的連續 tB(t) 描述一條由 P0 P1 的直線。

[編輯] 二次曲線

為建構二次貝茲曲線,可以中介點 Q0Q1 作為由 0 至 1 的 t

  • P0P1 的連續點 Q0,描述一條線性貝茲曲線。
  • P1P2 的連續點 Q1,描述一條線性貝茲曲線。
  • Q0Q1 的連續點 B(t),描述一條二次貝茲曲線。
二次貝茲曲線的結構 二次貝茲曲線演示動畫,t in [0,1]
二次貝茲曲線的結構 二次貝茲曲線演示動畫,t in [0,1]

[編輯] 高階曲線

為建構高階曲線,便需要相應更多的中介點。對於三次曲次,可由線性貝茲曲線描述的中介點 Q0Q1Q2,和由二次曲線描述的點 R0R1 所建構:

三次貝茲曲線的結構 三次貝茲曲線演示動畫,t in [0,1]
三次貝茲曲線的結構 三次貝茲曲線演示動畫,t in [0,1]

對於四次曲線,可由線性貝茲曲線描述的中介點 Q0Q1Q2Q3,由二次貝茲曲線描述的點 R0R1R2,和由三次貝茲曲線描述的點 S0S1 所建構:

四次貝茲曲線的結構 四次貝茲曲線演示動畫,t in [0,1]
四次貝茲曲線的結構 四次貝茲曲線演示動畫,t in [0,1]


(還可參閱五階貝茲曲線的構成。)

[編輯] 應用

[編輯] 電腦繪圖

Image:Bézier curve in Adobe Illustrator CS2.png
Bézier path in Adobe Illustrator CS2
Image:BezierInterpolation.gif
Example of two cubic Bézier curves patched together (solid) compared to a 6th degree Bézier curve

貝茲曲線被廣泛地在計算機圖形中用來為平滑曲線建立模型。

二次和三次貝茲曲線最為常見

[編輯] 程式範例

下列程式碼為一簡單的實際運用範例,展示如何使用 C 標出三次方貝茲曲線。注意,此處僅簡單的計算多項式係數,並讀盡一系列由 0 至 1 的 t 值;實踐中一般不會這麼做,遞歸求解通常會更快速——以更多的記憶體為代價,花費較少的處理器時間。不過直接的方法較易於理解並產生相同結果。以下程式碼已使運算更為清晰。實踐中的最佳化會先計算係數一次,並在實際計算曲線點的迴圈中反複使用。此處每次都會重新計算,損失了效率,但程式碼更清楚易讀。

曲線的計算可在曲線陣列上將相連點畫上直線——點越多,曲線越平滑。

在部分架構中,下以程式碼也可由動態程式設計進行最佳化。舉例來說,dt 是一個常數,cx * t 則等同於每次反覆就修改一次常數。經反覆應用這種最佳化後,迴圈可被重寫為沒有任何乘法(雖然這個過程不是穩定數值的)。

/* 產生三次方貝茲曲線的程式碼 */ typedef struct { float x; float y; } Point2D; /* cp 在此是四個元素的陣列: cp[0] 為起始點,或上圖中的 P0 cp[1] 為第一個控制點,或上圖中的 P1 cp[2] 為第二個控制點,或上圖中的 P2 cp[3] 為結束點,或上圖中的 P3 t 為參數值,0 <= t <= 1 */ Point2D PointOnCubicBezier( Point2D* cp, float t ) { float ax, bx, cx; float ay, by, cy; float tSquared, tCubed; Point2D result; /* 計算多項式係數 */ cx = 3.0 * (cp[1].x - cp[0].x); bx = 3.0 * (cp[2].x - cp[1].x) - cx; ax = cp[3].x - cp[0].x - cx - bx; cy = 3.0 * (cp[1].y - cp[0].y); by = 3.0 * (cp[2].y - cp[1].y) - cy; ay = cp[3].y - cp[0].y - cy - by; /* 計算位於參數值 t 的曲線點 */ tSquared = t * t; tCubed = tSquared * t; result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x; result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y; return result; } /* ComputeBezier 以控制點 cp 所產生的曲線點,填入 Point2D 結構的陣列。 呼叫者必須分配足夠的記憶體以供輸出結果,其為 <sizeof(Point2D) numberOfPoints> */ void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve ) { float dt; int i; dt = 1.0 / ( numberOfPoints - 1 ); for( i = 0; i < numberOfPoints; i++) curve[i] = PointOnCubicBezier( cp, i*dt ); }

另一種貝茲曲線的應用是在動畫中,描述物件的運動路徑等等。此處,曲線的 x、y 位置不用來標示曲線,但用來表示圖形位置。當用在這種形式時,連續點之間的距離會變的更為重要,且大多不是平均比例。點將會串的更緊密,控制點更接近每一個點,而更為稀疏的控制點會散的更開。如果需要線性運動速度,進一步處理時就需要循所需路徑將點平均分散。

[編輯] 有理貝茲曲線

有理貝茲增加可調節的權重,以提供更近似於隨意的形狀。分子是加權的伯恩斯坦形式貝茲曲線,而分母是加權的伯恩斯坦多項式的總和。

給定 n + 1 控制點 Pi,有理貝茲曲線可如下描述:

 
/mathbf{B}(t) =
/frac{
/sum_{i=0}^n b_{i,n}(t) /mathbf{P}_{i}w_i 
}
{
/sum_{i=0}^n b_{i,n}(t) w_i 
}

或簡單的

 
/mathbf{B}(t) =
/frac{
/sum_{i=0}^n {n /choose i} t^i (1-t)^{n-i}/mathbf{P}_{i}w_i 
}
{
/sum_{i=0}^n {n /choose i} t^i (1-t)^{n-i}w_i 
}

   

 


http://chatgpt.dhexx.cn/article/jvu3CoOI.shtml

相关文章

Bezier曲线原理及其代码实现

Bezier曲线原理及实现代码&#xff08;c&#xff09; 一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔?贝塞尔&#xff08;Pierre B?zier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Cast…

Bezier曲线及其性质

本文为Bezier曲线mooc教程学习笔记。 目录 Bezier曲线与曲面[1] Bezier曲线的背景[2] Bezier曲线[3] Bezier曲线详细定义[4] Bezier曲线举例[5] Bernstein 基函数性质[6] 贝塞尔曲线的性质[7] Bezier曲线的生成[8] Bezier曲线的拼接[9] Bezier曲线的升阶与降阶 Bezier曲线与曲面…

Bezier曲线原理

一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau 于1959年运用de Casteljau 算法开发&#xff0c;以稳…

如何将多张图片合成一个pdf?

如何将多张图片合成一个pdf&#xff1f;平时我们都喜欢将word或者ppt文件转换成pdf后再使用&#xff0c;除此之外&#xff0c;我们还会将多张图片合并转换成pdf文件&#xff0c;大家会用什么方法将图片合并成pdf呢&#xff1f;我相信有很多小伙伴会使用这个方法&#xff0c;先将…

怎么把四个图片合成一个图片?

怎么把四个图片合成一个图片&#xff1f;关于图片的合成&#xff0c;我们一般都会用到图片处理软件来进行。但是对于一些职场新人来说&#xff0c;他根本不会用一些专业的图片处理软件&#xff0c;那么这个问题对他来说就是非常棘手的。其实遇到这样的问题&#xff0c;新人朋友…

python将多张图片合并成一张图片

文章目录 说明&#xff1a;合并图片的三个过程1、参考原博主的&#xff1a;2、优化第一个数量问题&#xff1a;3、优化俩个问题&#xff08;数量不限性状按比例变小&#xff09;4、优化黑行高度问题5、合成图片不清晰问题&#xff1a;总结下&#xff1a; 说明&#xff1a; 今天…

如何把一张图片分割成几张

把一张图片分割成几张的方法&#xff1a; 工具/原料&#xff1a;硬件&#xff1a;电脑、软件&#xff1a;Photoshop 7.0、系统&#xff1a;Windows10专业版64位操作系统。 1、打开平PS&#xff0c;进入新建文档里面&#xff0c;然后把图片直接拉到界面中。或者直接打开图片。 2…

jpg怎么合成一份_如何将多张图片合成一个文件

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 将多张图片合成一个文件的方法是&#xff1a; 1、将所有图片拖到一个文件夹里&#xff0c;鼠标右键点击“添加压缩”。 2、点击确定&#xff0c;这样就成了一个文件。 计算机(compu…

怎样能把两张照片拼成一张图片,5种工具分享

怎样能把两张照片拼成一张图片&#xff1f;图片拼合的应用场景是很多的。比如将几张相册中的照片拼成一张合影、将多个地图截图拼合在一起形成一个更大的区域地图、将多个漫画图像合并成一本漫画册等。这项技术可以方便地将多张图片整合为一张&#xff0c;节省时间和精力。 因此…

怎么将几张照片合成一张图片,简单步骤易学

怎么将几张照片合成一张图片&#xff1f;在当代社会&#xff0c;图片已经成为了人们生活和工作中不可或缺的重要元素。无论是在网上浏览、社交媒体、电商平台、还是在企业营销、科研教育、娱乐创作等各种场合中&#xff0c;都有着广泛的应用。而将不同的图片进行合并&#xff0…

多张图片怎么合成一个pdf?

多张图片怎么合成一个pdf&#xff1f;相信大家和我一样&#xff0c;每天的工作或者生活学习都离不开pdf文件&#xff0c;因为pdf文件拥有更好的稳定性和安全性&#xff0c;不管是在电脑还是在其他设备上&#xff0c;都能正常的打开&#xff0c;而且pdf文件不易编辑的特性&#…

如何把两张图片拼在一起?

如何把两张图片拼在一起&#xff1f;一般来说&#xff0c;如果我们的照片只是简单处理的话&#xff0c;我们在手机上使用一些小软件就能完成&#xff0c;比如我们常使用的秀秀。但是如果说我们需要合成的照片是比较大的&#xff0c;那种专业相机拍出来的像素比较高。这种情况下…

多张图片合成一张jpg工具_如何将两张图片合成一张图片?

您可能感兴趣的话题&#xff1a; 美图秀秀 核心提示&#xff1a;图片叠加的方法也有几种&#xff0c;小编认为最好用、效果最好的是美图秀秀抠图叠加法。 看到许多网友焦急的询问一些图片处理方面的问题&#xff0c;一时又没人给点温馨的帮助&#xff0c;一向助人为乐的小编就坐…

多张图片怎么合成一个pdf文件?

小编作为一个上班族&#xff0c;每天会涉及到很多的图片文件&#xff0c;日积月累图片文件的整理和保存是一个任务艰巨的工作。那么如何更好的管理这些图片文件呢&#xff1f;小编有个好方法就是将有关系的某些图片文件全部整理到一个PDF文件内&#xff0c;这样一个类别的PDF包…

三张图片怎么拼成一张?

三张图片怎么拼成一张图片&#xff1f;相信大家平时都有往朋友圈分享图片的经历&#xff0c;朋友圈的九宫格是大部分人分享日常的常用方式&#xff0c;那如果大家想要分享的照片超过九张&#xff0c;就需要将图片拼接一下再发&#xff0c;这样就可以分享多张照片了。比如我将三…

怎么把多张图片合成为一张?

将多张图片合成为一张图片是在很多场合下都非常有必要的&#xff0c;例如设计制作等。其中&#xff0c;合成图片的关键性和重要性主要包括以下几点&#xff1a;首先&#xff0c;保证合并后的图片质量。在进行多张图片合成时&#xff0c;需要保证图片大小和分辨率的统一&#xf…

Python实现多张图片合成一张马赛克图片

前言 最近有网友私信我&#xff0c;问如何把多张图片合成一张马赛克图片的样子 说是女儿从出生到现在&#xff0c;所有的照片&#xff0c;大概有上百张&#xff0c;所以想使用这些照片合成一张&#xff0c;当做生日礼物 那我们今天就用上次爬表情包的图片来做一次马赛克图片…

两张图片怎样合成一张左右拼图?

相信很多小伙伴的手机和电脑上都储存了一定数量的图片&#xff0c;在使用这些图片的时候&#xff0c;因为一些需要有时候我们要将图片拼在一起使用&#xff0c;数量多的时候我们可以拼成长竖图或者长横图&#xff0c;当然也可以借助拼接软件里面的模板进行自由选择拼接。但是如…

怎么将三张图片合成一张图片?

怎么将三张图片合成一张图片&#xff1f;遇到这个问题&#xff0c;我们其实有很多方法来处理。我们首当其冲想到的是其中最常见的&#xff0c;可以使用我们手机的APP来处理&#xff0c;比如某秀秀等。但是此方法比较适合于尺寸比较小的图片进行合并&#xff0c;如果图片比较大的…

如何拼接多张图片,多张图片拼接成一张

如何拼接多张图片&#xff0c;多张图片拼接成一张&#xff1f;小编作为一名互联网行业的从业者&#xff0c;每天都需要使用到很多的图片&#xff0c;那么自然也需要对图片做各种不同的处理&#xff0c;例如格式转换、修改尺寸等。除了这些之外我还经常需要对图片进行拼接&#…