国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

貝塞爾曲線算法之JS獲取點(diǎn)

SQC / 2797人閱讀

摘要:什么是貝塞爾曲線貝塞爾曲線,又稱貝茲曲線或貝濟(jì)埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。這個(gè)是三階貝塞爾曲線,同理,綠點(diǎn)有個(gè),點(diǎn)與點(diǎn)之間都是按百分比運(yùn)動(dòng),最終得到一個(gè)小黑點(diǎn)。同理,還有四階貝塞爾。我們看看中階貝塞爾曲線上獲取點(diǎn)的效果的地址

什么是貝塞爾曲線?

貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟(jì)埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。


這個(gè)一階貝塞爾曲線繪制過程,黑點(diǎn)按百分比t從P0->P1移動(dòng),看不出什么呢~ 那繼續(xù)看后面的圖


這個(gè)是二階貝塞爾曲線,從P0->P1有個(gè)小綠點(diǎn)按百分比t運(yùn)動(dòng),從P1->P2也有個(gè)小綠點(diǎn)按百分比t運(yùn)動(dòng),兩個(gè)綠點(diǎn)之間也有個(gè)小黑點(diǎn)按百分比t運(yùn)動(dòng),這個(gè)黑點(diǎn)產(chǎn)生的軌跡就是一個(gè)二階貝塞爾曲線。


這個(gè)是三階貝塞爾曲線,同理,綠點(diǎn)有3個(gè),點(diǎn)與點(diǎn)之間都是按百分比t運(yùn)動(dòng),最終得到一個(gè)小黑點(diǎn)。這個(gè)小黑點(diǎn)的運(yùn)動(dòng)軌跡就是三階貝塞爾。


同理,還有四階貝塞爾。


同理,六階貝塞爾,N階貝塞爾。

實(shí)際上,我們的運(yùn)用中,3階貝塞爾就已經(jīng)足夠滿足我們的業(yè)務(wù)需求了,生活中,多個(gè)三階貝塞爾曲線可以組合成任意一條曲線,我們的photoshop里面的鋼筆工具就是3階貝塞爾曲線實(shí)現(xiàn)的。
貝塞爾曲線方程解析

數(shù)學(xué)家已經(jīng)給了我們公式:

不好意思,高數(shù)還給了老師,這尼瑪公式看不懂啊~ 沒關(guān)系,我們簡化下就能看懂了。

// t是百分比,a是參數(shù)

// 1階貝塞爾曲線公式
function onebsr(t, a1, a2) {
    return a1 + (a2 - a1) * t;
}

// 2階貝塞爾曲線公式
function twobsr(t, a1, a2, a3) {
    return ((1 - t) * (1 - t)) * a1 + 2 * t * (1 - t) * a2 + t * t * a3;
}

// 3階貝塞爾曲線公式
function threebsr(t, a1, a2, a3, a4) {
    return a1 * (1 - t) * (1 - t) * (1 - t) + 3 * a2 * t * (1 - t) * (1 - t) + 3 * a3 * t * t * (1 - t) + a4 * t * t * t;
}

根據(jù)公式,我們可以帶入坐標(biāo)進(jìn)行計(jì)算

/**
     * @desc 一階貝塞爾
     * @param {number} t 當(dāng)前百分比
     * @param {Array} p1 起點(diǎn)坐標(biāo)
     * @param {Array} p2 終點(diǎn)坐標(biāo)
     */
    oneBezier(t, p1, p2) {
        const [x1, y1] = p1;
        const [x2, y2] = p2;
        let x = x1 + (x2 - x1) * t;
        let y = y1 + (y2 - y1) * t;
        return [x, y];
    }

    /**
     * @desc 二階貝塞爾
     * @param {number} t 當(dāng)前百分比
     * @param {Array} p1 起點(diǎn)坐標(biāo)
     * @param {Array} p2 終點(diǎn)坐標(biāo)
     * @param {Array} cp 控制點(diǎn)
     */
    twoBezier(t, p1, cp, p2) {
        const [x1, y1] = p1;
        const [cx, cy] = cp;
        const [x2, y2] = p2;
        let x = (1 - t) * (1 - t) * x1 + 2 * t * (1 - t) * cx + t * t * x2;
        let y = (1 - t) * (1 - t) * y1 + 2 * t * (1 - t) * cy + t * t * y2;
        return [x, y];
    }

    /**
     * @desc 三階貝塞爾
     * @param {number} t 當(dāng)前百分比
     * @param {Array} p1 起點(diǎn)坐標(biāo)
     * @param {Array} p2 終點(diǎn)坐標(biāo)
     * @param {Array} cp1 控制點(diǎn)1
     * @param {Array} cp2 控制點(diǎn)2
     */
    threeBezier(t, p1, cp1, cp2, p2) {
        const [x1, y1] = p1;
        const [x2, y2] = p2;
        const [cx1, cy1] = cp1;
        const [cx2, cy2] = cp2;
        let x =
            x1 * (1 - t) * (1 - t) * (1 - t) +
            3 * cx1 * t * (1 - t) * (1 - t) +
            3 * cx2 * t * t * (1 - t) +
            x2 * t * t * t;
        let y =
            y1 * (1 - t) * (1 - t) * (1 - t) +
            3 * cy1 * t * (1 - t) * (1 - t) +
            3 * cy2 * t * t * (1 - t) +
            y2 * t * t * t;
        return [x, y];
    }
算法封裝

我把貝塞爾曲線封裝了下,添加了一個(gè)獲取路徑點(diǎn)的方法,然后使用span標(biāo)簽繪制到頁面上的效果。

我們看看DEMO中1~3階貝塞爾曲線上獲取點(diǎn)的效果


demo的github地址:https://github.com/mtsee/Bezier

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/102794.html

相關(guān)文章

  • [源碼閱讀]基于Canvas+塞爾曲線算法的平滑手寫板

    摘要:對(duì)于能畫出貝塞爾曲線的,對(duì)已經(jīng)求出的實(shí)例,執(zhí)行,否則執(zhí)行畫點(diǎn)的方法獲取配置中的,執(zhí)行畫點(diǎn)。總結(jié)閱讀一遍后,這個(gè)庫說白就是基礎(chǔ)的事件操作貝塞爾曲線算法,但是,它內(nèi)部的代碼格式非常清晰,細(xì)粒度代碼復(fù)用使得維護(hù)起來非常方便。 signature_pad一個(gè)基于Canvas的平滑手寫畫板工具 介紹 實(shí)現(xiàn)手寫有多種方式。 一種比較容易做出的是對(duì)鼠標(biāo)移動(dòng)軌跡畫點(diǎn),再將兩點(diǎn)之間以直線相連,最后再...

    Darkgel 評(píng)論0 收藏0
  • canvas進(jìn)階——如何畫出平滑的曲線?

    摘要:,算法就是這樣,那我們基于該算法再對(duì)現(xiàn)有代碼進(jìn)行一次升級(jí)改造設(shè)置線條顏色在原有的基礎(chǔ)上,我們創(chuàng)建了一個(gè)變量用于保存之前事件中鼠標(biāo)經(jīng)過的點(diǎn),根據(jù)該算法可知要繪制二次貝塞爾曲線起碼需要個(gè)點(diǎn)以上,因此我們只有在中的點(diǎn)數(shù)大于時(shí)才開始繪制。 背景概要 相信大家平時(shí)在學(xué)習(xí)canvas 或 項(xiàng)目開發(fā)中使用canvas的時(shí)候應(yīng)該都遇到過這樣的需求:實(shí)現(xiàn)一個(gè)可以書寫的畫板小工具。 嗯,相信這對(duì)canva...

    Cobub 評(píng)論0 收藏0
  • canvas進(jìn)階——如何畫出平滑的曲線?

    摘要:,算法就是這樣,那我們基于該算法再對(duì)現(xiàn)有代碼進(jìn)行一次升級(jí)改造設(shè)置線條顏色在原有的基礎(chǔ)上,我們創(chuàng)建了一個(gè)變量用于保存之前事件中鼠標(biāo)經(jīng)過的點(diǎn),根據(jù)該算法可知要繪制二次貝塞爾曲線起碼需要個(gè)點(diǎn)以上,因此我們只有在中的點(diǎn)數(shù)大于時(shí)才開始繪制。 背景概要 相信大家平時(shí)在學(xué)習(xí)canvas 或 項(xiàng)目開發(fā)中使用canvas的時(shí)候應(yīng)該都遇到過這樣的需求:實(shí)現(xiàn)一個(gè)可以書寫的畫板小工具。 嗯,相信這對(duì)canva...

    _ivan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<