亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

Canvas高級(jí)路徑操作之拖拽對(duì)象的實(shí)現(xiàn)

2024-08-26 00:21:39
字體:
供稿:網(wǎng)友

為了追蹤所畫內(nèi)容,諸如畫圖應(yīng)用程序、計(jì)算機(jī)輔助設(shè)計(jì)系統(tǒng)(computer-aided design system 簡(jiǎn)稱CAD系統(tǒng))以及游戲等許多應(yīng)用程序,都會(huì)維護(hù)一份包含當(dāng)前顯示對(duì)象的列表。通常來說,這些應(yīng)用程序都允許用戶對(duì)當(dāng)前顯示在屏幕上的物體進(jìn)行操作。比方說,在CAD應(yīng)用程序中,我們可以對(duì)設(shè)計(jì)中的元素進(jìn)行選擇、移動(dòng)、縮放等操作

——《HTML5 Canvas核心技術(shù)》

在Canvas中 實(shí)現(xiàn)拖拽 也同樣如此,Canvas提供了一個(gè)名為 isPointInPath(x, y) 的API,判斷 點(diǎn)(x, y) 是否在路徑之中。如果在路徑之中,則返回true。于是我們可以有如下思路:

維護(hù)一個(gè)可以描述各個(gè)路徑的 數(shù)組 ,通過 ispointInPath(x, y) 判斷點(diǎn)擊位置是否在某一個(gè)路徑之中,如果在此路徑之中,選中此路徑,進(jìn)行操作(移動(dòng)、縮放等),再繪制圖形

此文我以 多邊形拖拽為例進(jìn)行說明 ,Demo如下(后面的印子是錄屏軟件的原因:japanese_ogre:):

 

 
Canvas,高級(jí)路徑,拖拽對(duì)象 

 

CodePen打開

Demo中的多邊形如何繪制之前做過總結(jié),不再贅述:ghost::Canvas多邊形繪制

思路說明

下圖給了大致的說明及偽代碼,思路并不難,但有部分細(xì)節(jié)需要處理

 

 
Canvas,高級(jí)路徑,拖拽對(duì)象 

 

代碼結(jié)構(gòu)說明

此處列舉代碼結(jié)構(gòu)及標(biāo)注其思路,更詳細(xì)的代碼注釋已在CodePen之中

因?yàn)楸疚闹攸c(diǎn)在拖拽(drag),所以對(duì)繪圖部分描述會(huì)較少

//繪制多邊形路徑函數(shù)function drawPolygonPath//多邊形類定義class Polygon{    ...}//根據(jù)點(diǎn)擊事件返回在canvas中的位置function positoinInCanvas//獲取兩點(diǎn)間直線距離function getDistance//開始階段,記錄拖拽對(duì)象canvas.onmousedown//拖拽階段,畫路徑,描邊canvas.onmousemove//結(jié)束階段,更新拖拽對(duì)象位置canvas.onmouseup

關(guān)鍵部分說明

接下來開始代碼中的關(guān)鍵部分及細(xì)節(jié)處理

如何維護(hù)拖拽對(duì)象數(shù)組

在程序初始化時(shí),我們定義一個(gè)polygonArray數(shù)組

polygonArray = []

在每次畫一個(gè)新的多邊形之后,都會(huì)new一個(gè)多邊形對(duì)象推入數(shù)組中進(jìn)行維護(hù)

const polygon = new Polygon(mouseStart.get('x'), mouseStart.get('y'), sideNum, radius);polygonArray.push(polygon);//記錄路徑對(duì)象

在后續(xù)點(diǎn)擊操作時(shí),需要根據(jù)對(duì)應(yīng)信息確定點(diǎn)擊位置是否在路徑之中

點(diǎn)擊時(shí),如何選取要拖拽的對(duì)象

首先獲取點(diǎn)擊時(shí)在 canvas中 的對(duì)應(yīng)位置,我的代碼用 mouseStart 記錄 x 及 y 
接著遍歷 polygonArray 中的 polygon ,遍歷中調(diào)用 polygon.createPath() ,通過 isPointInPath() 判斷點(diǎn)擊位置是否有路徑,有的話 draggingPolygon = polygon 結(jié)束函數(shù)

const pos = positionInCanvas(e, canvasLeft, canvasTop);//獲取在canvas中的像素位置//記錄鼠標(biāo)起始點(diǎn)smouseStart.set('x', pos.x);mouseStart.set('y', pos.y);...for (let polygon of polygonArray) {                polygon.createPath();                if (ctx.isPointInPath(mouseStart.get('x'), mouseStart.get('y'))) {                    draggingPolygon = polygon;                    return;                }            }

拖拽時(shí)的計(jì)算

這部分要完全理解推薦大家根據(jù)Demo中兩個(gè) console.log(draggingPolygon) 及代碼進(jìn)行調(diào)試,因?yàn)槲覀兪窃?nbsp;mousemove 階段,這個(gè)階段觸發(fā)函數(shù)非常頻繁

我盡量用語言表達(dá)清楚

首先計(jì)算 move 時(shí)與 mouseStart 的距離,記為diff,有x軸上的 offsetX ,也有y軸上的 offsetY

const    pos = positionInCanvas(e, canvasLeft, canvasTop),    diff = new Map([      ['offsetX', pos.x - mouseStart.get('x')],      ['offsetY', pos.y - mouseStart.get('y')]    ]);

接著記錄當(dāng)前拖拽對(duì)象的 centerX 及 centerY ,記為temp

let    tempCenterX = draggingPolygon.centerX,    tempCenterY = draggingPolygon.centerY;

這里就是難理解的點(diǎn),為什么要記錄?繼續(xù)往下看,后面會(huì)使用到。

根據(jù) diff 中的offset,設(shè)置draggingPolygon新的中心位置

draggingPolygon.centerX += diff.get('offsetX');draggingPolygon.centerY += diff.get('offsetY');

接著清空畫布進(jìn)行繪制新的路徑和描邊

ctx.clearRect(0, 0, canvas.width, canvas.height);for (let polygon of polygonArray) {    drawPolygonPath(polygon.sideNum,         polygon.radius,         polygon.centerX,         polygon.centerY, ctx);    ctx.stroke();}

最后使用到上文中的 tempCenterX 與 tempCenterY :

draggingPolygon.centerX = tempCenterX;draggingPolygon.centerY = tempCenterY;

為什么需要這么做呢?

因?yàn)槲覀兊耐献?nbsp;基于多邊形的原位置 ,而 mousemove 階段并 不能確定函數(shù)的最終位置 ,如果這時(shí)沒有復(fù)原的話,會(huì)出現(xiàn) "漂移" ,我把這兩行代碼注釋掉,效果如下:

 

 
Canvas,高級(jí)路徑,拖拽對(duì)象 

 

如果我沒說清楚,墻裂推薦大家對(duì)代碼進(jìn)行修改和調(diào)試

拖拽后的處理

拖拽完成后是處于 mouseup 階段,此時(shí)我們已經(jīng)確定dragginPolygon的最終位置,進(jìn)行更新即可,最后置為null,排除 在沒有拖拽多邊形情況下,鼠標(biāo)在畫布上移動(dòng)觸發(fā)對(duì)應(yīng)代碼

const    pos = positionInCanvas(e, canvasLeft, canvasTop),    offsetMap = new Map([        ['offsetX', pos.x - mouseStart.get('x')],        ['offsetY', pos.y - mouseStart.get('y')]    ]);draggingPolygon.centerX += offsetMap.get('offsetX');draggingPolygon.centerY += offsetMap.get('offsetY');draggingPolygon = null;

結(jié)語

其實(shí)這個(gè)功能實(shí)現(xiàn)并不難,關(guān)鍵是了解一個(gè)概念:通過維護(hù)當(dāng)前顯示對(duì)象的列表及isPointInPath進(jìn)行判斷來實(shí)現(xiàn)追蹤
最后歡迎大家交流學(xué)學(xué)習(xí)

參考資料

《HTML5 Canvas核心技術(shù)》

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美bbbbbbbbbbbb精品| 十大黄色软件免费看| 欧美色视频免费| 成人在线国产视频| 中文字幕在线观看1| 欧美一级免费看| 黄色三级生活片| 国产区亚洲区欧美区| 777一区二区| 男人的天堂日韩| 一本色道久久综合亚洲精品按摩| 精品国内自产拍在线观看| 久久99热狠狠色一区二区| 在线观看日韩欧美| 激情综合网五月| 国产一区二区美女诱惑| 亚洲bt欧美bt日本bt| 色一情一乱一伦一区二区三区| 色8久久影院午夜场| 特级毛片在线免费观看| 亚洲成人午夜电影| 国产麻豆视频免费观看| 亚洲福利国产精品| 中文字幕免费精品一区高清| 日韩av在线电影| 男女爱爱视频网站| 91极品视频在线| 亚洲精品日韩在线观看| 黑人精品xxx一区一二区| 国产真实乱在线更新| 一区二区三区不卡视频在线观看| 五月激情综合网| 综合视频免费看| 欧美乱妇一区二区三区不卡视频| 欧美国产一二三区| 日本特黄特色aaa大片免费| 国产人妻人伦精品1国产丝袜| 亚洲欧美小说国产图片| 欧美激情视频三区| 91在线视频播放| 狠狠久久五月精品中文字幕| 在线精品视频小说1| 成年人网站在线观看免费| 18成人免费观看视频漫画| 成人激情av在线| 91麻豆精品国产91久久久久| 精品人妻aV中文字幕乱码色欲| 亚洲第一影院| 日本乱人伦a精品| 一区二区三区高清不卡| 日韩欧美视频免费观看| 国产一区在线视频观看| 日韩黄色在线| 夜夜操com| 污污视频在线免费看| 你微笑时很美电视剧整集高清不卡| 欧美精品一区二区三区在线| 91精品国产自产在线老师啪| 久久亚洲人体| 亚洲一区日本| 97超碰欧美中文字幕| 国产九一精品| 中文字幕人成人乱码| 亚洲综合欧美在线| 尤物视频免费观看| 成年人视频免费| 一本大道av伊人久久综合| 最新国产在线拍揄自揄视频| 欧美成人免费大片| 国产精品综合网| 先锋资源中文字幕| 亚洲美女91| 91中文字精品一区二区| 小明看看成人免费视频| 欧美高清在线一区二区| 中文国产字幕在线观看| 成人性生交大片免费看中文| 国内精品久久久久久不卡影院| 免费一区二区三区在在线视频| 999久久久久久久久6666| 欧美福利在线视频| 亚州精品国产| 九九综合九九综合| 免费男女羞羞的视频网站中文字幕妖精视频| 三级视频在线看| 久久国产视频一区| 免费成年人视频在线观看| 国产精品日韩二区| 厕沟全景美女厕沟精品| 欧美精品国产白浆久久久久| 黄色在线成人| 99热6这里只有精品| 精品视频第一页| 免费看裸体网站| 免费看黄色一级大片| 清纯唯美亚洲综合一区| 亚洲视频专区在线| 国产精品久久久久久久泡妞| 欧美日韩黄色网| 亚洲免费av观看| 久久精品免费一区二区三区| 日韩在线天堂| 91亚洲国产成人久久精品麻豆| 欧美一区二区日韩一区二区| 久久av在线| 国内精品卡一卡二卡三| 不卡一卡2卡3卡4卡精品在| 亚洲国产岛国毛片在线| 国产高清精品在线观看| 91av福利视频| 久久99热99| 国色天香2019中文字幕在线观看| 久久精品福利视频| 日韩av免费一区| 国产日韩中文在线中文字幕| 日韩免费福利视频| 国产美女被下药99| 色欲av伊人久久大香线蕉影院| 亚洲人成电影在线| 国产蜜臀av在线一区二区三区| 美女把尿口扒开让男人桶在线观看| 日本精品一区二区三区在线播放视频| 农村老熟妇乱子伦视频| www.久久成人| 中文 日韩 欧美| www.亚洲一区二区三区| 亚洲国产成人精品久久| 中文字幕第一页在线视频| 超薄肉色丝袜足j调教99| 欧美xxxxx18| 国产视频一区二区在线播放| 精品一区二区精品| 国产69精品久久久久久| 国产a∨精品一区二区三区仙踪林| 免费一区二区三区在在线视频| 亚洲欧美综合一区二区| 中文字幕伦av一区二区邻居| 欧美色图校园春色| gogo人体一区| 亚洲伊人久久大香线蕉av| 一区二区三区在线观看www| 免费欧美视频| 成人av.网址在线网站| 亚洲国产视频一区二区| 国产69精品久久久久9999| 国产欧美一区在线| 26uuu国产一区二区三区| 亚洲欧美日韩在线观看a三区| 国产999精品| 欧美日韩在线精品成人综合网| 久久r这里只有精品| 欧美日韩在线视频观看| 国产免费黄色大片| 在线黄色免费网站| 日本韩国欧美一区二区三区| 日韩一级av毛片| 亚洲国产中文字幕| 你懂的免费在线观看| 国产成人午夜性a一级毛片| 好吊操这里只有精品| 日韩电影免费观看中文字幕| av岛国在线| 高清av资源| 中文字幕精品一区二区三区精品| 色天使在线视频| 欧美乱妇一区二区三区不卡视频| 亚洲91网站| 岛国精品资源网站| 男人操女人免费网站| 欧美精品videosbestsex另类| 精品一区二区三区香蕉蜜桃| 黄色三级免费电影| 国产69精品久久| 日韩一二区视频| 污视频网站免费在线观看| 69日小视频在线观看| 欧美激情精品| jizzjizzwww| 国精产品一区一区三区视频| 成人免费淫片视频软件| 夫妇露脸对白88av| 97精品国产97久久久久久免费| 国产极品模特精品一二| 久久精品国产成人av| 久久亚洲精精品中文字幕| 99久久综合精品| 图片区偷拍区小说区| 国产成人自拍视频在线| 亚洲精品第一国产综合精品| 久久国产精品免费一区| 午夜激情福利视频| 一本到不卡精品视频在线观看| 国产精品灌醉下药二区| 青青免费在线视频| 精品伦一区二区三区| 亚洲综合在线不卡| 中文字幕永久视频| 韩日精品一区二区| 国产经典自拍视频在线观看| 成人蜜桃视频网站网址| 国产一区二区三区自拍| 色悠久久久久综合先锋影音下载| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 草莓视频性福宝| 国产成人a人亚洲精品无码| 亚洲精品国产片| 亚洲欧洲激情在线乱码蜜桃| 拍真实国产伦偷精品| 日本在线天堂| 大陆极品少妇内射aaaaa| 欧美性猛片xxxxx免费中国| 精品国产欧美日韩一区二区三区| 激情综合色播五月| 久久只有这里有精品| 偷偷看偷偷操| 波多野结衣在线观看一区二区三区| 91视频在线网站| 久久精品影视伊人网| 欧美日韩国产中文字幕| a√在线中文网新版址在线| 先锋资源在线视频| 96sao精品免费视频观看| 亚洲一区二三| 韩国三级成人在线| а√天堂资源官网在线资源| 精品欧美一区二区在线观看视频| 米奇.777.com| 久久视频这里只有精品| av午夜电影| www.亚洲成人| 好操啊在线观看免费视频| 欧美一级二级三级| 亚洲自拍中文字幕| 欧美成人精品欧美一级| 免费在线观看91| 精品国产一区二区三区四区vr| 国产精品99免视看9| 欧美日韩国产经典色站一区二区三区| 亚洲综合爱爱久久网| 精品国产亚洲一区二区三区在线| 不用播放器的免费av| 成人在线观看免费网站| 黄色资源在线看| 精品一区二区三区免费看| 中文字幕在线看高清电影| 国产传媒一区二区| 欧美**室bdsm视频| 日韩加勒比系列| 亚洲激情欧美色图| 国产二区在线播放| 亚洲综合色自拍一区| 色婷婷综合久久久久中文字幕1| 爱高潮www亚洲精品| 色综合久久网| 3d欧美精品动漫xxxx无尽| 在线观看av中文| 日本黄色一区二区| 国产精品久久久久aaaa九色| 亚洲综合日韩在线| 亚洲国产精品电影在线观看| 久久视频国产精品免费视频在线| 欧美日产国产精品| 中文幕无线码中文字蜜桃| 亚洲精品久久久成人| 亚洲精品爱爱久久| 日韩电影av| 中文字幕欧美一区| 欧美人成免费网站| 日日狠狠久久偷偷四色综合免费| 免费成人深夜夜行视频| 九色在线视频蝌蚪| 精品一区二区三区免费播放| 欧美国产小视频| 亚洲影院一区二区三区| 你懂的网址一区二区三区| 庆余年2免费日韩剧观看大牛| 中文字幕 久热精品 视频在线| 国产美女精品人人做人人爽| 亚洲最大的免费| 国产精品系列在线观看| 亚洲国产成人porn| 91网站在线看| 黄色视屏免费在线观看| 一区二区三区四区在线免费观看| 国产在线视频网站| 日韩在线观看免费高清| 日韩一级高清毛片| 丁香六月激情综合| 无人区在线高清完整免费版 一区二| 欧洲中文字幕国产精品| 午夜大尺度福利视频| 成年人看的羞羞网站| 亚洲伦理中文字幕| 五月激情四射婷婷| 国产欧美日韩一区二区三区在线观看| 一级特黄大欧美久久久| 亚洲欧美激情国产综合久久久| 亚洲欧美三级在线| 久久午夜视频| 亚洲一区二区蜜桃| 欧美日韩视频精品二区| 欧美日韩综合一区二区| 手机av在线不卡| 精品盗摄女厕tp美女嘘嘘| 国产美女www爽爽爽| 久久久亚洲精华液精华液精华液| 久久99久久久久| 亚洲国产福利| 亚洲第一视频网站| 久久视频中文字幕| 国偷自产视频一区二区久| 精品福利免费观看| 亚洲永久网站| 欧美猛男性生活免费| 日韩欧美一区二区三区久久婷婷| 久热中文字幕在线精品首页| 精品视频资源站| 国产精品jizz在线观看美国| 99精品久久只有精品| 国产一级久久| 亚洲色图第三页| 好男人在线视频www| 精品一区二区三区自拍图片区| 精品手机在线视频| 精品一区二区影视| 欧美一级高潮片| 亚洲精品视频在线| 热99精品只有里视频最新|