成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > html5中監(jiān)聽canvas內(nèi)部元素點(diǎn)擊事件的三種方法

html5中監(jiān)聽canvas內(nèi)部元素點(diǎn)擊事件的三種方法

熱門標(biāo)簽:漳州人工外呼系統(tǒng)排名 鶴壁手機(jī)自動外呼系統(tǒng)怎么安裝 濟(jì)南辦理400電話 跟電銷機(jī)器人做同事 ai電銷機(jī)器人連接網(wǎng)關(guān) 威海營銷外呼系統(tǒng)招商 中紳電銷智能機(jī)器人 鄭州電銷外呼系統(tǒng)違法嗎 農(nóng)村住宅地圖標(biāo)注

canvas內(nèi)部元素不能像DOM元素一樣方便的添加交互事件監(jiān)聽,因?yàn)閏anvas內(nèi)不存在“元素”這個(gè)概念,他們僅僅是canvas繪制出來的圖形。這對于交互開發(fā)來說是一個(gè)必經(jīng)障礙,想要監(jiān)聽圖形的點(diǎn)擊事件思路很簡單,只要監(jiān)聽canvas元素本身的點(diǎn)擊事件,再判斷點(diǎn)擊坐標(biāo)位于哪一個(gè)圖形內(nèi)部,就變相實(shí)現(xiàn)了圖形點(diǎn)擊事件。本文將介紹三種方法,判斷坐標(biāo)點(diǎn)是否位于某個(gè)canvas圖形內(nèi)部。

約定

本文介紹的三種方法適用于識別canvas內(nèi)形狀不規(guī)則而且位置無規(guī)律的圖形點(diǎn)擊事件,對于形狀規(guī)則或者位置有規(guī)律的場景,肯定有更簡便的實(shí)現(xiàn),這里不做討論。

像素法

像素檢測法的思路是,將canvas中的多個(gè)圖形(如果有多個(gè)的話)分別離屏繪制,并用 getImageData() 方法分別獲取到像素?cái)?shù)據(jù)保存起來。當(dāng)canvas元素監(jiān)聽到點(diǎn)擊事件時(shí),通過點(diǎn)擊坐標(biāo)可以直接推算出點(diǎn)擊發(fā)生在canvas上的第幾個(gè)像素,然后遍歷前面保存的圖形數(shù)據(jù),看看這個(gè)像素的alpha值是不是0,如果是0說明落點(diǎn)不在當(dāng)前圖形內(nèi),否則就說明點(diǎn)到了這個(gè)圖形。

根據(jù)點(diǎn)擊坐標(biāo)得到所點(diǎn)擊的像素序號的方法:

像素序號 = (縱坐標(biāo)-1) * canvas寬度 + 橫坐標(biāo)

比如在寬度為 5 的畫布上點(diǎn)擊坐標(biāo) (3,3) ,根據(jù)上述公式得到像素序號是 (3-1) * 5 + 3 = 18 ,如圖所示:

因?yàn)閏anvas導(dǎo)出的圖形數(shù)據(jù)是將每個(gè)像素以 rgba 的順序存成4個(gè)數(shù)字組成的數(shù)組,所以想訪問指定像素的alpha值,只要讀取這個(gè)數(shù)組的第 pIndex * 4 + 3 個(gè)值就可以了,如果這個(gè)值不為0,說明該像素可見,也就是點(diǎn)擊到了該圖形。

這個(gè)方法是我認(rèn)為思路最直接、結(jié)果最準(zhǔn)確、而且對圖形形狀沒有任何要求的方法,但這個(gè)方法有一個(gè)致命的局限,當(dāng)圖形需要在畫布上移動時(shí),要頻繁的創(chuàng)建數(shù)據(jù)緩存才能保證檢測結(jié)果準(zhǔn)確,受到畫布尺寸和圖形數(shù)量的影響, getImageData() 方法的性能會成為嚴(yán)重的瓶頸。所以如果canvas圖形是靜態(tài)的,這個(gè)方法非常適合,否則就不適合用這個(gè)方法了。

角度法

角度判斷法的原理很容易理解,如果一個(gè)點(diǎn)在多邊形內(nèi)部,則該點(diǎn)與多邊形所有頂點(diǎn)兩兩構(gòu)成的夾角,相加應(yīng)該剛好等于360°。

計(jì)算過程可以轉(zhuǎn)變?yōu)橐韵氯齻€(gè)步驟:

1.已知多邊形頂點(diǎn)和已知坐標(biāo),將坐標(biāo)與頂點(diǎn)兩兩組合成三點(diǎn)隊(duì)列
2. 已知三點(diǎn)求夾角,可以使用 余玄定理
3.判斷夾角之和是否360°

每一步都很簡單,實(shí)現(xiàn)如下:

//計(jì)算兩點(diǎn)距離
const getDistence = function (p1, p2) {
  return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))
};
//角度法判斷點(diǎn)在多邊形內(nèi)部
const checkPointInPolyline = (point, polylinePoints) => {
    let totalA = 0;
    const A = point;
    for (let i = 0; i < polylinePoints.length; i++) {
        let B, C;
        if (i === polylinePoints.length - 1) {
            B = {
                x: polylinePoints[i][0],
                y: polylinePoints[i][1]
            };
            C = {
                x: polylinePoints[0][0],
                y: polylinePoints[0][1]
            };
        } else {
            B = {
                x: polylinePoints[i][0],
                y: polylinePoints[i][1]
            };
            C = {
                x: polylinePoints[i + 1][0],
                y: polylinePoints[i + 1][1]
            };
        }
        //計(jì)算角度
        const angleA = Math.acos((Math.pow(getDistence(A, C), 2) + Math.pow(getDistence(A, B), 2) - Math.pow(getDistence(B, C), 2)) / (2 * getDistence(A, C) * getDistence(A, B)))
        totalA += angleA
    }
    //判斷角度之和
    return totalA === 2 * Math.PI
}

這個(gè)方法有一個(gè)局限性,就是圖形必須是 凸多邊形 。如果不是凸多邊形需要先切割成凸多邊形再計(jì)算,這就比較復(fù)雜了。

類似的思路還有面積法,如果一個(gè)點(diǎn)在多邊形內(nèi)部,那么該點(diǎn)與多邊形所有頂點(diǎn)兩兩構(gòu)成的三角形,面積相加應(yīng)該等于多邊形的面積,首先計(jì)算多邊形的面積就很麻煩,所以這種方法可以直接pass掉。

射線法

射線法是一個(gè)我講不清道理但非常好用的方法,只要判斷點(diǎn)與多邊形一側(cè)的交點(diǎn)個(gè)數(shù)為奇數(shù),則點(diǎn)在多邊形內(nèi)部。需要注意的是,只要數(shù)任何一側(cè)的焦點(diǎn)個(gè)數(shù)就可以,比如左側(cè)。這個(gè)方法不限制多邊形的類型,凸多邊形、凹多邊形甚至環(huán)形都可以。

實(shí)現(xiàn)起來也非常簡單:


 

const checkPointInPolyline = (point, polylinePoints) => {
    //射線法
  let leftSide = 0;
  const A = point;
  for (let i = 0; i < polylinePoints.length; i++) {
    let B, C;
    if (i === polylinePoints.length - 1) {
      B = {
        x: polylinePoints[i][0],
        y: polylinePoints[i][1]
      };
      C = {
        x: polylinePoints[0][0],
        y: polylinePoints[0][1]
      };
    } else {
      B = {
        x: polylinePoints[i][0],
        y: polylinePoints[i][1]
      };
      C = {
        x: polylinePoints[i + 1][0],
        y: polylinePoints[i + 1][1]
      };
    }
    //判斷左側(cè)相交
    let sortByY = [B.y, C.y].sort((a,b) => a-b)
    if (sortByY[0] < A.y && sortByY[1] > A.y){
      if(B.x<A.x || C.x < A.x){
        leftSide++
      }
    }
  }
  return leftSide % 2 === 1
}

射線法有一種特殊情況,當(dāng)點(diǎn)在多變形的一條邊上時(shí)需要特殊處理。但在工程中我認(rèn)為也可以不處理,因?yàn)槿绻脩魟偤命c(diǎn)在圖形的邊界上,那么程序認(rèn)為他沒有點(diǎn)到也講的過去。

總結(jié)

以上三種方法都可以實(shí)現(xiàn)canvas中不規(guī)則圖形的點(diǎn)擊檢測。其中,像素法的優(yōu)勢在于不挑形狀,而且在靜態(tài)場景中有一定的性能優(yōu)勢;角度法應(yīng)該說只有理論價(jià)值,實(shí)用性不佳;工程中最實(shí)用的當(dāng)屬射線法,局限性小,實(shí)現(xiàn)簡單,多數(shù)時(shí)候只需要知道射線法就可以了。
 

 

標(biāo)簽:萍鄉(xiāng) 惠州 紅河 營口 蘇州 咸陽 甘南 文山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《html5中監(jiān)聽canvas內(nèi)部元素點(diǎn)擊事件的三種方法》,本文關(guān)鍵詞  html5,中,監(jiān)聽,canvas,內(nèi)部,元素,點(diǎn)擊,事件,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《html5中監(jiān)聽canvas內(nèi)部元素點(diǎn)擊事件的三種方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于html5中監(jiān)聽canvas內(nèi)部元素點(diǎn)擊事件的三種方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    在线观看色网站| 欧美日韩在线影院| 精品无人乱码一区二区三区的优势| 在线精品福利| caoporm在线视频| 网站黄色在线观看| 久久久久久久久久久久久夜| 国产欧美一区二区三区米奇| 5566先锋影音夜色资源站在线观看| 亚洲欧洲综合| jizzjizzjizz国产| 视频一区二区三区免费观看| 成人香蕉社区| 国产伦视频一区二区三区| 成人影院在线免费观看| 极品尤物一区二区三区| 久久精品99久久久香蕉| 欧美一级一区二区三区| 精品系列免费在线观看| 日韩区在线观看| 国产精品高潮呻吟久久| 青青草视频在线免费播放| 日韩一级完整毛片| 美女一区二区久久| 日韩aaaa| 亚洲午夜91| 99在线视频免费观看| 久久久久国产精品免费网站| 丁香六月激情婷婷| 欧美精品成人一区二区在线观看| 精品一区二区三区蜜桃在线| 欧美18—19性高清hd4k| 999热视频在线观看| 粉嫩绯色av一区二区在线观看| 中文一区一区三区高中清不卡免费| 欧美日韩和欧美的一区二区| 国产69精品久久久| 亚洲国产精品久久久久婷婷884| 欧美性受xxxx黑人xxxx| 久久精品无码一区二区三区| 久久一区二区三区欧美亚洲| 巨乳诱惑日韩免费av| 亚洲欧洲在线视频| 91tv官网精品成人亚洲| 欧美特黄一级大片| 国产亚洲一区二区三区在线观看| 中文字幕 91| 一区二区三区高清在线视频| 亚洲一区二区三区国产| 亚洲国产婷婷香蕉久久久久久| 97caopron在线视频| 国产精品特级毛片一区二区三区| 中文字幕成人精品久久不卡| 久久免费国产精品| 欧美在线观看视频一区| 久久视频精品在线观看| 久久久亚洲福利精品午夜| 日韩精品在线第一页| 欧美挠脚心视频网站| 色综合久综合久久综合久鬼88| 91视频在线观看免费| 比比资源先锋影音网| 中文字幕第一页在线| 国产伦子伦对白在线播放观看| 久久久九九九九| 国产一区二区视频在线免费观看| 国产成人无码aa精品一区| ass极品国模人体欣赏| 久久久久久欧美精品se一二三四| 日韩中文字幕久久| 日本中文字幕在线播放| 精品国产av鲁一鲁一区| 一区二区免费视频| 欧美日本一道本在线视频| 欧美成人国产| 91精品久久久久久久久不口人| 中文字幕中文字幕在线中一区高清| 亚洲精品成人三区| av女在线播放| 日韩成人一区二区三区在线观看| av老司机久久| 成人国产综合| 天天操天天干视频| 免费在线观看av电影| 国产亚洲一级高清| 川上优av中文字幕一区二区| 在线观看日韩精品| 国产高清免费在线观看| 中文字幕一区二区三区四区视频| 久久好看免费视频| 欧美黑人又粗大| 久久网站免费观看| 精品国产鲁一鲁一区二区张丽| 国产一级特黄a大片免费| 精品99re| 成年人黄色电影| av在线播放不卡| 国产日韩另类视频一区| 亚洲天堂av老司机| 久久久综合久久| 视频一区亚洲| 欧美中文字幕在线播放| 亚洲天堂国产精品| 嫩草香蕉在线91一二三区| 亚洲精品一区二区三区四区高清| 高清精品一区二区三区一区| caoporn国产精品免费公开| 国产一区av在线| 精品视频网站| 国产精品啊啊啊| 国产在线看片免费视频在线观看| 91精品国产乱码久久久久久| 亚洲免费在线| 成年免费视频黄网站在线观看| 亚洲第一中文字幕| 九色视频网站入口| 日韩免费电影一区| 男人添女荫道口女人有什么感觉| 制服丝袜日韩国产| 国模私拍一区二区国模曼安| 亚州精品永久观看视频| 精品人妻伦一二三区久久| 欧美中文字幕一二三四区| 国产亚洲欧美日韩美女| 狠狠综合久久| 亚洲最大色综合成人av| 色狠狠久久aa北条麻妃| 精品亚洲成av人在线观看| 在线毛片网站| 最新精品视频| 欧美中文一区二区三区| av中文字幕在线看| 在线观看免费小视频| 欧美日韩精品免费观看视频完整| 国产日韩免费视频| 欧美三级一区| 亚洲综合电影一区二区三区| 99久久婷婷国产综合| 欧美欧美一区二区| 9国产精品午夜| 国产99久久精品一区二区永久免费| 欧美精品日韩一本| 在线观看国产网站| 在线日韩国产精品| 亚洲第一av网站| 天堂√最新版中文在线| 可以免费看不卡的av网站| 国内一区二区在线视频观看| 亚洲最大福利视频网站| 国产毛片视频网站| 中文字幕在线观看第三页| 少妇精品久久久一区二区三区| 新版的欧美在线视频| 四虎国产精品永久地址998| 夜夜操夜夜操| 91黄色小网站| 欧洲美女精品免费观看视频| 欧美jiizzhd精品欧美| 国产精品美女av| 精品视频在线观看免费观看| 四虎永久在线精品免费网址| 免费h视频网站| 99t1这里只有精品| 国产精品成人一区二区三区吃奶| 日本无删减在线| 日本一级一片免费视频| 欧美一级视频免费观看| 风韵丰满熟妇啪啪区老熟熟女| www.国产.com| 国产九九在线| 中文字幕少妇一区二区三区| 99热久久这里只有精品| 欧美少妇bbb| 亚洲精品2区| 亚洲国产高清aⅴ视频| jvid福利在线一区二区| 手机看片久久久| 全网国产福利在线播放| 欧产日产国产精品98| 国产啪精品视频网站| 日韩久久一级片| 99国产精品久久一区二区三区| 国产亚洲精品久久久久久久| 日韩有码在线视频| 日韩精品资源二区在线| 日韩一区二区三区在线观看视频| 久久九九亚洲综合| 99在线精品视频| 午夜视频福利在线| 日日爱66.cn| 久久在线精品| 国产精品aaaa| 免费黄色网址在线观看| 校园春色影音先锋| 2022国产精品| 污污网站在线观看| 国产传媒一区在线| 一级毛片国产| 五月天电影免费在线观看一区| 亚洲精品欧美| 337p日本欧洲亚洲大胆色噜噜| 91黄色免费视频| 欧美色视频日本高清在线观看| 2018高清国产日本一道国产| 在线播放成人av| 潘金莲一级淫片aaaaa免费看| 欧美aa国产视频| 欧洲精品在线一区| 亚洲精品无码久久久| 自拍偷拍亚洲视频| 中文字幕资源网在线观看免费| 日本va中文字幕| 国产天堂视频在线观看| 欧美日韩国产亚洲一区| 国产传媒视频在线| 国产天堂视频在线观看| 日韩午夜精品视频| 日本福利视频在线| 女性生殖扒开酷刑vk| 青娱乐精品在线| 国产又爽又黄免费视频| 亚洲欧美另类日韩| 欧美亚洲另类激情另类| av资源在线免费观看| 一区二区高清免费观看影视大全| 阿v视频在线观看| 香蕉av一区二区三区| 成人在线小视频| 亚洲淫成人影院| 青青草精品视频在线观看| 亚洲熟女乱色一区二区三区久久久| 中文字幕精品视频在线| 欧美精品制服第一页| 久久99影院| 亚洲在线视频一区| 五月婷婷六月丁香| 91亚洲天堂| 在线观看中文字幕码| 精品亚洲aⅴ无码一区二区三区| 欧美黄页免费| 亚洲一区二区三区四区不卡| 日本三级网站在线观看| 日韩欧美精品综合| 中国美女乱淫免费看视频| 看高清中日韩色视频| 亚洲精品一线二线三线无人区| 中国日本在线视频中文字幕| 国产色婷婷国产综合在线理论片a| xxxxwwww在线免费观看| 久久国产精品免费| 理论片午午伦夜理片在线播放| 黄色三级中文字幕| 特一级黄色片| 日韩美女啊v在线免费观看| 日本道色综合久久| 黄页网站免费观看| 中文字幕第一页在线| 911精品美国片911久久久| 秋霞欧美在线观看| 欧洲激情视频| gogo大胆日本视频一区| 日韩一区二区福利| 国产精品香蕉在线观看| 午夜精品中文字幕| 免费黄色在线网址| 爽好多水快深点欧美视频| 浮生影视网在线观看免费| 欧美顶级少妇做爰| 亚洲丝袜啪啪| 久久综合给合| 91成人免费观看网站| 全国精品免费看| 无码国产精品一区二区免费16| 久久婷婷久久一区二区三区| 国产偷人妻精品一区二区在线| 丰满少妇又爽又紧又丰满电影| 亚洲精品中文字幕乱码无线| 久久久久久久9| 久久久噜噜噜久久狠狠50岁| 日日摸夜夜爽人人添| 91视频免费看| 天堂…中文在线最新版在线| 色猫av在线| 国产一级特黄a高潮片| 国产精品探花在线观看| 天天av综合网| 精品人妻少妇AV无码专区| 久久mv成人精品亚洲动漫| 在线免费观看黄色小视频| 亚洲欧美制服第一页| 日日摸日日添日日躁av| 精品乱色一区二区中文字幕| 亚洲v国产v| 偷偷要色偷偷| 999精品国产| 91精品人妻一区二区三区蜜桃2| 国产91九色蝌蚪| 你懂的视频在线观看资源| 国产精品嫩草影视| 欧美精品尤物在线| 欧美激情视频在线免费观看 欧美视频免费一| 黄色网页在线| 97超碰人人爽| 精品久久久无码人妻字幂| 一区二区视频免费看| 日韩欧美中文| 日韩成人av在线资源| 亚洲av电影一区| 亚洲a∨精品一区二区三区导航| 亚洲免费视频一区二区| 中文字幕国产在线观看| 亚洲丁香久久久| 四虎影视成人永久免费观看视频| 嘿咻视频在线看| 男人午夜影院| 欧美视频免费看| 成人国产激情| 亚洲熟妇无码av在线播放| 国色天香一区二区| 婷婷丁香综合网| 黄色片网站免费| 综合久久给合久久狠狠狠97色| 麻豆精品视频在线原创| 免费99精品国产自在在线| 91九色在线视频| 久草在线中文最新视频| 日本黄色电影网站| 亚洲国产日韩a在线播放|