午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > canvas進階之如何畫出平滑的曲線

canvas進階之如何畫出平滑的曲線

熱門標簽:地圖標注軟件打印出來 ok電銷機器人 惡搞電話機器人 高德地圖標注商戶怎么標 黃石ai電銷機器人呼叫中心 電話機器人技術 如何查看地圖標注 智能電銷機器人被禁用了么 欣鼎電銷機器人 效果

背景概要

相信大家平時在學習canvas 或 項目開發(fā)中使用canvas的時候應該都遇到過這樣的需求:實現(xiàn)一個可以書寫的畫板小工具。

嗯,相信這對canvas使用較熟的童鞋來說僅僅只是幾十行代碼就可以搞掂的事情,以下demo就是一個再也簡單不過的例子了:

<!DOCTYPE html>
<html>
<head>
    <title>Sketchpad demo</title>
    <style type="text/css">
        canvas {
            border: 1px blue solid; 
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="800" height="500"></canvas>
    <script type="text/javascript">
        let isDown = false;
        let beginPoint = null;
        const canvas = document.querySelector('#canvas');
        const ctx = canvas.getContext('2d');

        // 設置線條顏色
        ctx.strokeStyle = 'red';
        ctx.lineWidth = 1;
        ctx.lineJoin = 'round';
        ctx.lineCap = 'round';

        canvas.addEventListener('mousedown', down, false);
        canvas.addEventListener('mousemove', move, false);
        canvas.addEventListener('mouseup', up, false);
        canvas.addEventListener('mouseout', up, false);

        function down(evt) {
            isDown = true;
            beginPoint = getPos(evt);
        }

        function move(evt) {
            if (!isDown) return;
            const endPoint = getPos(evt);
            drawLine(beginPoint, endPoint);
            beginPoint = endPoint;
        }

        function up(evt) {
            if (!isDown) return;
            
            const endPoint = getPos(evt);
            drawLine(beginPoint, endPoint);

            beginPoint = null;
            isDown = false;
        }

        function getPos(evt) {
            return {
                x: evt.clientX,
                y: evt.clientY
            }
        }

        function drawLine(beginPoint, endPoint) {
            ctx.beginPath();
            ctx.moveTo(beginPoint.x, beginPoint.y);
            ctx.lineTo(endPoint.x, endPoint.y);
            ctx.stroke();
            ctx.closePath();
        }
    </script>
</body>
</html>

它的實現(xiàn)邏輯也很簡單:

  • 我們在canvas畫布上主要監(jiān)聽了三個事件:mousedownmouseupmousemove,同時我們也創(chuàng)建了一個isDown變量;
  • 當用戶按下鼠標(mousedown,即起筆)時將isDown置為true,而放下鼠標(mouseup)的時候將它置為false,這樣做的好處就是可以判斷用戶當前是否處于繪畫狀態(tài);
  • 通過mousemove事件不斷采集鼠標經(jīng)過的坐標點,當且僅當isDowntrue(即處于書寫狀態(tài))時將當前的點通過canvas的lineTo方法與前面的點進行連接、繪制;

通過以上幾個步驟我們就可以實現(xiàn)基本的畫板功能了,然而事情并沒那么簡單,仔細的童鞋也許會發(fā)現(xiàn)一個很嚴重的問題——通過這種方式畫出來的線條存在鋸齒,不夠平滑,而且你畫得越快,折線感越強。表現(xiàn)如下圖所示:

為什么會這樣呢?

問題分析

出現(xiàn)該現(xiàn)象的原因主要是:

我們是以canvas的lineTo方法連接點的,連接相鄰兩點的是條直線,非曲線,因此通過這種方式繪制出來的是條折線;

受限于瀏覽器對mousemove事件的采集頻率,大家都知道在mousemove時,瀏覽器是每隔一小段時間去采集當前鼠標的坐標的,因此鼠標移動的越快,采集的兩個臨近點的距離就越遠,故“折線感越明顯“;

如何才能畫出平滑的曲線?

要畫出平滑的曲線,其實也是有方法的,lineTo靠不住那我們可以采用canvas的另一個繪圖API——quadraticCurveTo ,它用于繪制二次貝塞爾曲線。

二次貝塞爾曲線

quadraticCurveTo(cp1x, cp1y, x, y)

調用quadraticCurveTo方法需要四個參數(shù),cp1xcp1y描述的是控制點,而xy則是曲線的終點:

更多詳細的信息可移步MDN

既然要使用貝塞爾曲線,很顯然我們的數(shù)據(jù)是不夠用的,要完整描述一個二次貝塞爾曲線,我們需要:起始點、控制點和終點,這些數(shù)據(jù)怎么來呢?

有一個很巧妙的算法可以幫助我們獲取這些信息

獲取二次貝塞爾關鍵點的算法

這個算法并不難理解,這里我直接舉例子吧:

假設我們在一次繪畫中共采集到6個鼠標坐標,分別是A, B, C, D, E, F;取前面的A, B, C三點,計算出BC的中點B1,以A為起點,B為控制點,B1為終點,利用quadraticCurveTo繪制一條二次貝塞爾曲線線段;

接下來,計算得出CD點的中點C1,以B1為起點、C為控制點、C1為終點繼續(xù)繪制曲線;

依次類推不斷繪制下去,當?shù)阶詈笠粋€點F時,則以DE的中點D1為起點,以E為控制點,F為終點結束貝塞爾曲線。

OK,算法就是這樣,那我們基于該算法再對現(xiàn)有代碼進行一次升級改造:

let isDown = false;
let points = [];
let beginPoint = null;
const canvas = document.querySelector('#canvas');
const ctx = canvas.getContext('2d');

// 設置線條顏色
ctx.strokeStyle = 'red';
ctx.lineWidth = 1;
ctx.lineJoin = 'round';
ctx.lineCap = 'round';

canvas.addEventListener('mousedown', down, false);
canvas.addEventListener('mousemove', move, false);
canvas.addEventListener('mouseup', up, false);
canvas.addEventListener('mouseout', up, false);

function down(evt) {
    isDown = true;
    const { x, y } = getPos(evt);
    points.push({x, y});
    beginPoint = {x, y};
}

function move(evt) {
    if (!isDown) return;

    const { x, y } = getPos(evt);
    points.push({x, y});

    if (points.length > 3) {
        const lastTwoPoints = points.slice(-2);
        const controlPoint = lastTwoPoints[0];
        const endPoint = {
            x: (lastTwoPoints[0].x + lastTwoPoints[1].x) / 2,
            y: (lastTwoPoints[0].y + lastTwoPoints[1].y) / 2,
        }
        drawLine(beginPoint, controlPoint, endPoint);
        beginPoint = endPoint;
    }
}

function up(evt) {
    if (!isDown) return;
    const { x, y } = getPos(evt);
    points.push({x, y});

    if (points.length > 3) {
        const lastTwoPoints = points.slice(-2);
        const controlPoint = lastTwoPoints[0];
        const endPoint = lastTwoPoints[1];
        drawLine(beginPoint, controlPoint, endPoint);
    }
    beginPoint = null;
    isDown = false;
    points = [];
}

function getPos(evt) {
    return {
        x: evt.clientX,
        y: evt.clientY
    }
}

function drawLine(beginPoint, controlPoint, endPoint) {
    ctx.beginPath();
    ctx.moveTo(beginPoint.x, beginPoint.y);
    ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
    ctx.stroke();
    ctx.closePath();
}

在原有的基礎上,我們創(chuàng)建了一個變量points用于保存之前mousemove事件中鼠標經(jīng)過的點,根據(jù)該算法可知要繪制二次貝塞爾曲線起碼需要3個點以上,因此我們只有在points中的點數(shù)大于3時才開始繪制。接下來的處理就跟該算法一毛一樣了,這里不再贅述。

代碼更新后我們的曲線也變得平滑了許多,如下圖所示:

本文到這里就結束了,希望大家在canvas畫板中“畫”得愉快~我們下次再見:)

感興趣的童鞋可戳這里關注我的博客,任何新鮮好玩的博文將會第一時間分享到這兒哦~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:聊城 金昌 阿壩 中山 綏化 赤峰 盤錦 萍鄉(xiāng)

巨人網(wǎng)絡通訊聲明:本文標題《canvas進階之如何畫出平滑的曲線》,本文關鍵詞  canvas,進階,之,如何,畫出,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《canvas進階之如何畫出平滑的曲線》相關的同類信息!
  • 本頁收集關于canvas進階之如何畫出平滑的曲線的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    天天综合天天添夜夜添狠狠添| 亚洲精品久久久一区二区三区| 国产a视频精品免费观看| 国产免费人做人爱午夜视频| 91麻豆国产语对白在线观看| 欧美日韩一区国产| 久久久久久久久艹| 91免费版网站入口| 91av在线免费| 国产精品偷伦免费视频观看的| 精品美女被调教视频大全网站| 日本少妇裸体做爰| 久久国产精品亚洲va麻豆| 91精品国产91久久| 日韩欧美中文字幕一区| 亚洲精品久久久蜜桃动漫| 中文字幕欧美人与畜| 亚洲免费观看视频| 成人永久免费视频| 欧美久久久久免费| 亚洲乱码一区二区| 国产欧美一区二区三区四区| 免费看污污视频| 青青草原播放器| 波多野吉衣中文字幕| 亚洲aaa视频| 国产a级片网站| 亚洲区 欧美区| 亚洲女人久久久| 亚洲无码久久久久| 小泽玛利亚一区| 欧美色图亚洲天堂| 美女脱光内衣内裤视频久久网站| 久久精品亚洲国产奇米99| 91黄色在线视频| 91人人澡人人爽人人精品| 国产成人在线亚洲欧美| 日韩电影中文字幕在线观看| 97久久超碰国产精品| 成人做爰69片免费看网站| 国产在线播放一区| 中文字幕一区二区久久人妻网站| 国产成人永久免费视频| 69av一区二区三区| 久久天堂精品| 国产精品嫩草影院精东| 在线视频 91| 人与嘼交av免费| 欧美黄色免费影院| 亚洲www视频| 国产精品激情av电影在线观看 | 日本三级2019| 图片区小说区区亚洲五月| 欧美sm极限捆绑bd| 亚洲av片在线观看| 尤物网站在线观看| 欧美一级电影久久| 色综合久久久久久久久久久| 国产一区二三区| 成年人免费视频播放| 亚洲精品日韩激情在线电影| 欧美色视频在线| www.蜜臀av| 最新免费av网址| 国产精品你懂得| 五月天激情综合| 老熟妇一区二区三区啪啪| 一区二区三区一级片| 亚洲成人激情视频| 成人亚洲一区二区一| 麻豆国产欧美一区二区三区| 日韩中文字幕影院| 成人爽a毛片一区二区| 国产探花在线视频| 日本系列第一页| 天天干在线影院| 欧美日高清视频| xf在线a精品一区二区视频网站| 日韩av一区二区三区四区| 国产免费无码一区二区视频| 日韩视频在线免费播放| 97超级碰碰碰久久久| 午夜成人在线视频| 免播放器亚洲一区| 欧美日韩精品区| 欧美精品自拍视频| 欧美猛男性生活免费| 亚洲第一搞黄网站| 国产视频手机在线| 欧美丰满艳妇bbwbbw| 日本一区二区黄色| 午夜精品免费视频| 欧美日韩国产经典色站一区二区三区| 麻豆freexxxx性91精品| 国产一级黄色av| 天天久久综合网| 日本成人三级电影网站| 综合国产在线视频| 天天亚洲美女在线视频| 奇米精品一区二区三区四区| 国产女优在线播放| www在线观看免费视频| 人妻熟女一二三区夜夜爱| a级免费在线观看| 在线视频不卡国产| 色偷偷www8888| 毛片一区二区三区四区| 91精品国产综合久久久久久丝袜 | 日韩一区二区在线观看视频| 毛片精品免费在线观看| 最新欧美日韩亚洲| 国产免费a级片| 激情综合网五月婷婷| 蜜桃视频在线观看一区二区| 欧美剧情电影在线观看完整版免费励志电影| 91中文字精品一区二区| 黄色国产在线播放| 欧美国产精品中文字幕| 亚洲经典中文字幕| 国色天香2019中文字幕在线观看| 欧美高清视频一区| 一区二区三区影视| 成人精品视频一区二区三区尤物| 成人av在线一区二区三区| 午夜精品国产更新| 日本精品二区| 国产精品一二三四五区| 久久综合狠狠综合久久综合88| 自拍偷拍亚洲在线| 日韩视频第二页| 欧美三级在线观看视频| 亚洲第一网站在线观看| 亚洲色图视频网| 日韩暖暖在线视频| 国产精品www爽爽爽| 日本成人超碰在线观看| 色视频一区二区| 97在线精品国自产拍中文| 啊啊啊一区二区| 国产成人a v| 色屁屁草草影院ccyycom| 欧美二区三区的天堂| 美女日批免费视频| 国产成人在线观看| 这里只有精品免费| 少妇免费毛片久久久久久久久| 午夜视频网站在线观看| 一本大道伊人av久久综合| 欧美在线999| 国产激情片在线观看| xnxx国产精品| 欧美变态另类刺激| 樱桃国产成人精品视频| 日本熟妇人妻xxxxx| 国产精品欧美久久久久无广告| 久久久久久a亚洲欧洲aⅴ| 日本视频网站在线观看| 日韩欧美中文字幕在线播放| 欧美日产一区二区三区在线观看| 久久亚洲精品石原莉奈| 欧美日韩黄视频| 亚洲综合精品一区二区| 无套内谢大学处破女www小说| 麻豆精品一区二区| 国产亚洲精品自在久久| 色欲av永久无码精品无码蜜桃 | 亚洲视频第一页| 清纯唯美一区二区三区| 五月婷中文字幕| 日本亚洲精品在线观看| 色婷婷视频在线| 精品国产一区二区三区麻豆小说 | 久久午夜精品视频| 99视频一区二区三区| 91在线视频导航| 亚洲精品国产精品乱码在线观看| 国产尤物视频在线观看| 亚洲黄色免费网站| 久久久久久av| 无码日韩人妻精品久久蜜桃| 蜜臀久久99精品久久久久久9 | 国产高潮在线观看| 中文字幕国产亚洲2019| 中国特黄一级片| 亚洲视频电影图片偷拍一区| 精品久久久久成人码免费动漫| 国产精品美女久久久久av福利| 中文字幕精品一区二区精品绿巨人| 可以看毛片的网址| 午夜精品久久久| 亚洲黄色小说图片| 中文视频一区视频二区视频三区| 激情小说亚洲一区| 播放灌醉水嫩大学生国内精品| 国产精品色一区二区三区| 亚洲综合20p| 精品美女久久久久久免费| 亚洲精品在线视频观看| 亚洲视频久久久| 精品三级在线观看| 国产日韩成人内射视频| 日韩毛片在线免费观看| 欧美中文字幕视频在线观看| 蜜桃视频最新网址| 日韩禁在线播放| 国产精品欧美亚洲| 青青草成人在线| 欧美在线视频精品| 91chinesevideo永久地址| 精品久久久久久久久久久久久久久久| 岛国一区二区在线观看| 亚洲一区二区精品在线| 91婷婷韩国欧美一区二区| 日韩成人手机在线| 久久蜜臀精品av| 国产深夜男女无套内射| 亚洲另类春色国产| 国产传媒久久久| 亚洲色图另类专区| 国产一二三四区在线观看| 成人在线免费看视频| 欧美日韩亚洲丝袜制服| 艳母动漫在线免费观看| 99久久婷婷国产一区二区三区| 精品黑人一区二区三区久久| 免费毛片在线播放免费| 日韩av观看网址| 国产又色又爽又黄的| 欧美日韩国产成人在线| 亚洲综合一区中| 一区中文字幕在线观看| 日韩久久精品一区| 日韩在线一二三区| 午夜免费视频网站| 97精品视频在线观看| 99re成人精品视频| 久久久福利影院| 精品夜色国产国偷在线| 中文字幕日韩一区二区三区| 成人国产精品免费网站| 日韩中文字幕组| 色欧美88888久久久久久影院| av2014天堂网| 日韩女同互慰一区二区| 欧美 日韩 国产 激情| 一区二区在线观看av| 三级黄色片免费观看| 久久久久久亚洲| 成人激情校园春色| 国产精品-区区久久久狼| 日本韩国精品在线| 日本一区二区网站| 日韩精品在线视频观看| 国产特黄级aaaaa片免| 色综合五月天导航| 久久av资源网| 乱码一区二区三区| 日韩av色综合| 欧美精品视频www在线观看| 久久99精品国产.久久久久久| 国产午夜在线一区二区三区| 国产成人精品一区二区| 欧美国产精品专区| 精品无码一区二区三区| 久久久噜噜噜久久久| av一区二区三| 一级黄色录像免费看| 亚洲地区一二三色| 内射一区二区三区| 91色视频在线观看| www.国产麻豆| 精品在线视频一区二区| 亚洲天堂成人在线观看| 亚洲人与黑人屁股眼交| 国产精品av一区| 亚洲精品精品亚洲| 午夜精产品一区二区在线观看的| 欧美丰满少妇xxxxx| 9人人澡人人爽人人精品| 欧美日韩亚洲在线| 国产精品久久免费看| 午夜爱爱毛片xxxx视频免费看| 99三级在线| 亚洲一区二区3| 国产精品成人久久| 在线免费观看成人| 亚洲精品国产成人久久av盗摄 | 手机在线免费看毛片| 国产日本欧美一区| 亚洲丝袜精品丝袜在线| 青青草视频成人| 亚洲国产精品久久久久久| 青娱乐国产在线视频| 2018中文字幕一区二区三区| 韩国一区二区视频| 给我免费播放片在线观看| 7777女厕盗摄久久久| 国产88在线观看入口| 久久久国产精品久久久| 日韩在线不卡视频| 91色在线porny| 欧美狂猛xxxxx乱大交3| 91免费欧美精品| 亚洲精品五月天| 黑人粗进入欧美aaaaa| 欧美日韩一区二区在线视频| 亚洲欧美综合另类| 国产精品v欧美精品v日韩精品| 亚洲欧洲性图库| 岛国毛片在线观看| 免费精品视频一区二区三区| 日韩一级片在线播放| 午夜婷婷在线观看| 国产一区免费观看| 日韩欧美一区二区三区| 伊人手机在线视频| 亚洲精品不卡| 日韩精品中午字幕| 看电视剧不卡顿的网站| 中文在线永久免费观看| 国产精品美女诱惑| 欧洲av在线精品| 韩国v欧美v日本v亚洲v| 免费黄色片网站| www.四虎在线观看| 亚洲成av人乱码色午夜| 免费观看毛片网站| 亚洲精品无码久久久久久久| 成人自拍爱视频| 亚洲福利在线看| 国产成人综合网| 中文字幕一区二区三区四区视频| 无码aⅴ精品一区二区三区浪潮 | 熟女少妇一区二区三区| 日本a级片电影一区二区| 国产精品电影院| 日本中文字幕在线免费观看| 久久免费看毛片| 欧美成人一区二区三区电影| 亚洲成av人片观看| 美女一区二区三区| brazzers精品成人一区| 国产精品视频福利| 久久精品亚洲94久久精品| 欧美三级欧美成人高清www| 亚洲日本一区二区| 国产日韩欧美精品综合| 不卡av电影在线播放| 免费人成精品欧美精品| 黄色一级大片在线免费看国产| 中文字幕理论片| 久热精品在线观看| 日本黄色网址大全| 黄网站色视频免费观看| 国产精品美女久久久久av超清| 欧美日韩一区二区三区四区五区| 99久久精品免费看| av av片在线看| 佐山爱在线视频| 亚洲免费久久| 国产精品自拍小视频| 欧美成人国产一区二区| 懂色av中文一区二区三区 | 久久91精品国产91久久久| 婷婷成人激情在线网| 麻豆91在线播放免费| 中文字幕美女视频| 色老头一区二区| 久操手机在线视频| dy888夜精品国产专区| 久久男人的天堂| 日韩av123| 国产精品久久久av| 日韩美女主播视频| 日韩av男人的天堂| 国产欧美精品va在线观看| 91精品免费看| 99re视频| 欧美精品一区二区三区四区五区| 久久久久久久久综合| 日韩成人黄色av| 日本韩国欧美国产| 国产二区国产一区在线观看 | 天天综合色天天综合色hd| 性欧美xxxx交| 亚洲色图50p| 日韩一级免费一区| 一区二区三区.www| 国产一区二区三区四区五区美女| 男女视频免费看| 亚洲天堂av网站| 自慰无码一区二区三区| 欧美日韩亚洲一区二区三区四区| 欧洲亚洲免费视频| 中文字幕亚洲一区在线观看| 精品亚洲一区二区三区| 亚洲韩国日本中文字幕| 欧美一区二区人人喊爽| 国产精品久久久久久久久免费丝袜| 大陆成人av片| 99久久免费国产| 国产精品亚洲一区二区三区妖精| 久久综合色鬼综合色| 中文字幕在线不卡一区二区三区| 色综合婷婷久久| 精品国产精品一区二区夜夜嗨| 欧美刺激性大交免费视频| 国产日韩欧美中文| 成人午夜电影免费在线观看| 日韩欧美在线观看强乱免费|