玩過ps的同窗,應該用過一個鋼筆工具。html
而鋼筆產生的就是貝塞爾曲線。還有這裏來體驗一下:git
https://myst729.github.io/bezier-curve/github
Bezier曲線分爲一次/二次/三次/屢次貝塞爾曲線,之因此這麼分是爲了更好的理解其中的內涵。工具
一次貝塞爾曲線(線性Bezier),實際上就是一條鏈接兩點的直線段。
二次貝塞爾曲線,就是兩點間的一條拋物線,利用一個控制點來控制拋物線的形狀。
三次貝塞爾曲線,則須要一個起點,一個終點,兩個控制點來控制曲線的形狀。
實例以下:在http://cubic-bezier.com/#.42,0,1,1的地方體驗一下。spa
一階曲線。.net
二階的貝塞爾曲線是這樣畫出來的。code
而多階的是這樣的。cdn
那二階的計算公式,其中 0<=t<=1。htm
二階的計算點的公式: P0*(1-t)^2 + 2*P1*t(1-t) + P2*t^2 =P,其中P0爲起始點,P1爲控制點,P2爲終點。那咱們用matlab仿真,代碼以下:blog
%% 起始點 startx=1; starty=1; %% 終止點 endx=10; endy=0; %% 控制點 cont1x=5; cont1y=1; %% 生成曲線 pointnum=100;%步數 t=1/(pointnum-1); for i=1:pointnum-1 x= startx*(1-i*t)^2 + cont1x*2*i*t*(1-i*t) + endx*(i*t)^2; y= starty*(1-i*t)^2 + cont1y*2*i*t*(1-i*t) + endy*(i*t)^2; hold on; plot(x,y,'.'); end plot(startx,starty,'*') plot(endx,endy,'*') plot(cont1x,cont1y,'*')
四個點的話就是兩個控制點 p1,p2,另外兩個就是起點和終點p0,p3。
公式爲: P = P0*(1-t)^3 +3*P1*t*(1-t)^2+3*P2*(1-t)*t^2+P3*t^3 。
C++代碼以下:
struct Point_Float { float x; float y; }; float MetaComputing(float p0, float p1, float p2, float p3, float t) { // 方法一: float a, b, c; float tSquare, tCube; // 計算多項式係數 c = 3.0 * (p1 - p0); b = 3.0 * (p2 - p1) - c; a = p3 - b - c - p0; // 計算t位置的點 tSquare = t * t; tCube = t * tSquare; return (a * tCube) + (b * tSquare) + (c * t) + p0; // 方法二: 原始的三次方公式 // float n = 1.0 - t; // return n*n*n*p0 + 3.0*p1*t*n*n + 3.0*p2*t*t*n + p3*t*t*t; } float MetaComputing(float p0, float p1, float p2, float t) { // 方法一: float a, b, c; float tmin; // 計算多項式係數 c = p0; b = 2.0 * p1; a = p2; // 計算t位置的點 tmin = 1-t; return (tmin*tmin*c) + (tmin*t*b) + (t*t*a); } Point_Float PointOnTrieBezier(Point_Float* cp, float t) { Point_Float tPoint; tPoint.x = MetaComputing(cp[0].x, cp[1].x, cp[2].x, cp[3].x, t); tPoint.y = MetaComputing(cp[0].y, cp[1].y, cp[2].y, cp[3].y, t); return tPoint; } Point_Float PointOnCubeBezier(Point_Float* cp, float t) { Point_Float tPoint; tPoint.x = MetaComputing(cp[0].x, cp[1].x, cp[2].x, t); tPoint.y = MetaComputing(cp[0].y, cp[1].y, cp[2].y, t); return tPoint; }
http://blog.csdn.net/cdnight/article/details/48468653