Bezier曲線

  • 給定一個有序的點集 P0, P1, …, Pn, 可以決定一個 n次 的Bezier曲線段
  • 曲線次數(shù) = 控制點數(shù)目 - 1

插入點 = 控制點基函數(shù)乘積和

Bezier曲線公式

其中的基函數(shù)或稱調(diào)和函數(shù)為 Bernstein多項式
該多項式的第一項是 組合數(shù)

Bernstein多項式

例如,由 P0、P1、P2、P3四個控制點 構(gòu)成的控制多邊形來構(gòu)造
此時調(diào)和函數(shù)為:

三次Bezier曲線調(diào)和函數(shù)
// 畫貝葉斯曲線
void drawBezierCurve() {

    double *base = new double[b.degree + 1];            // 存儲基函數(shù)值

    Point2D *insert_points = new Point2D[insertNum];    // 存儲插入點

    double step = 1.0 / (insertNum - 1);                // 插值點步長,均勻插值

    int j = 0;
    for (double t = 0.0; t <= 1.0; t += step) {
        for (int i = 0; i <= b.degree; ++i) {
            base[i] = C(b.degree, i) * pow(t, i) * pow(1 - t, b.degree - i);    // 組合數(shù)系數(shù)*后兩項
            insert_points[j].x += base[i] * b.cnt_points[i].x;                  // 控制點數(shù) = 次數(shù)+1
            insert_points[j].y += base[i] * b.cnt_points[i].y;
        }
        j++;
    }

    glColor3f(0.0, 1.0, 0.0);
    glLineWidth(2);
    glBegin(GL_LINE_STRIP);
    for (int i = 0; i < insertNum; i++)
    {
        glVertex2f(insert_points[i].x, insert_points[i].y);
    }
    glEnd();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容