摘要:近日在地圖開(kāi)發(fā)中遇到需要高度顯示指定區(qū)域的需求,圖形畫(huà)出來(lái)了,點(diǎn)擊事件卻成為一大難題,在中是沒(méi)有點(diǎn)擊事件的,只能通過(guò)點(diǎn)擊區(qū)域來(lái)判斷是否點(diǎn)擊了對(duì)象本來(lái)如果是正正經(jīng)經(jīng)的矩形,判斷點(diǎn)擊也不是什么難事,偏偏地圖就是帶著傾斜角度這樣就沒(méi)辦法簡(jiǎn)單的通過(guò)
近日在地圖開(kāi)發(fā)中遇到需要高度顯示指定區(qū)域的需求,圖形畫(huà)出來(lái)了,點(diǎn)擊事件卻成為一大難題,在canvas中是沒(méi)有dom點(diǎn)擊事件的,只能通過(guò)點(diǎn)擊區(qū)域來(lái)判斷是否點(diǎn)擊了對(duì)象.本來(lái)如果是正正經(jīng)經(jīng)的矩形,判斷點(diǎn)擊也不是什么難事,偏偏地圖就是帶著傾斜角度.這樣就沒(méi)辦法簡(jiǎn)單的通過(guò)x,y坐標(biāo)來(lái)判斷區(qū)域問(wèn)題,需要一個(gè)算法.
首先如果地圖沒(méi)有傾斜判斷方式應(yīng)該是x>左上角(a)的x坐標(biāo),小于右上角(b)的x坐標(biāo),y>右下角(c)的y坐標(biāo),小于右上角(b)的y坐標(biāo).這里的坐標(biāo)系為屏幕坐標(biāo)系,X軸向右為正,Y軸向下為正。
if (x >= a.x && x <= b.x && y >= c.y && y <= b.y){ //alert(true) }
獲取到的區(qū)域遠(yuǎn)遠(yuǎn)超過(guò)了 實(shí)際可點(diǎn)擊區(qū)域
我們需要把這個(gè)區(qū)域拆分為四個(gè)小區(qū)域,判斷坐標(biāo)在不在可點(diǎn)擊區(qū)域內(nèi)即可,要用到三角函數(shù)中的正切tan
so...
y/x < tan(deg)就是在區(qū)域內(nèi)
能夠獲取到的鼠標(biāo)點(diǎn)擊的坐標(biāo)(x,y),矩形四個(gè)點(diǎn)坐標(biāo)(a,b,c,d),地圖傾斜角度deg
調(diào)用方式應(yīng)該是:
checkClickArea(x,y,a,b,c,d,deg)
思路有了代碼便水到渠成
function checkClickArea(x,y,a,b,c,d,deg) { deg = 2 *Math.PI / 360 * deg; var pi = Math.tan(deg); if(x < a.x || x > c.x || y < b.y || y > d.y){ return false; }else if(x < b.x && ypi){ return false } return true }else if(x > b.x && y < c.y){ if((x-b.x) / (y-b.y) > pi){ return false } return true }else if(x > d.x && y > c.y){ if((d.y-y)/(x-d.x) < pi){ return false } return true }else if(x < d.x && y > a.y){ if((x-a.x)/(y-a.y) < pi){ return false } return true }else{ return true } }
其中Math.tan方法是個(gè)大坑,需要轉(zhuǎn)換為 2 Math.PI / 360 deg
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109054.html
摘要:判斷鼠標(biāo)點(diǎn)擊的位置是否在某個(gè)區(qū)域內(nèi),可用在右鍵菜單的顯示與隱藏等 //判斷鼠標(biāo)點(diǎn)擊的位置是否在某個(gè)div區(qū)域內(nèi),可用在右鍵菜單的顯示與隱藏等 function isInDiv(event,divId){ var div = document.getElementById(divId) var x=event.clientX var y=event.clientY...
摘要:當(dāng)運(yùn)行時(shí),如果不為,則將超時(shí)函數(shù)推送到事件隊(duì)列,并且函數(shù)退出,從而使調(diào)用堆棧清零。因此,該方法從頭到尾不經(jīng)過(guò)直接遞歸調(diào)用即可處理,因此調(diào)用堆棧保持清晰,無(wú)論迭代次數(shù)如何。 前端常用代碼片段(一) 點(diǎn)這里前端常用代碼片段(二) 點(diǎn)這里前端常用代碼片段(三) 點(diǎn)這里前端常用代碼片段(四) 點(diǎn)這里 1.tap事件點(diǎn)透問(wèn)題? 問(wèn)題點(diǎn)擊穿透問(wèn)題:點(diǎn)擊蒙層(mask)上的關(guān)閉按鈕,蒙層消失后發(fā)現(xiàn)觸...
摘要:原理分析使用延遲加載效果的網(wǎng)站,一般也會(huì)使用一個(gè)默認(rèn)的圖片來(lái)占位,比如優(yōu)酷和。這樣可以防止用戶(hù)在滾動(dòng)過(guò)快時(shí)造成可能出現(xiàn)的頁(yè)面結(jié)構(gòu)混亂和圖像一時(shí)加載不出來(lái)出現(xiàn)的。針對(duì)這一功能,也有一個(gè)常用的插件。 圖片延遲加載 許多網(wǎng)站的圖片是在下拉滾動(dòng)條時(shí)才加載,而此效果通常是用jQuery的lazyLoad或scrollLoading插件實(shí)現(xiàn)的。它可以延遲加載長(zhǎng)頁(yè)面中的圖片。在瀏覽器可視區(qū)域外的圖片...
摘要:原理分析使用延遲加載效果的網(wǎng)站,一般也會(huì)使用一個(gè)默認(rèn)的圖片來(lái)占位,比如優(yōu)酷和。這樣可以防止用戶(hù)在滾動(dòng)過(guò)快時(shí)造成可能出現(xiàn)的頁(yè)面結(jié)構(gòu)混亂和圖像一時(shí)加載不出來(lái)出現(xiàn)的。針對(duì)這一功能,也有一個(gè)常用的插件。 圖片延遲加載 許多網(wǎng)站的圖片是在下拉滾動(dòng)條時(shí)才加載,而此效果通常是用jQuery的lazyLoad或scrollLoading插件實(shí)現(xiàn)的。它可以延遲加載長(zhǎng)頁(yè)面中的圖片。在瀏覽器可視區(qū)域外的圖片...
閱讀 2294·2021-09-22 15:27
閱讀 3166·2021-09-03 10:32
閱讀 3491·2021-09-01 11:38
閱讀 2493·2019-08-30 15:56
閱讀 2206·2019-08-30 13:01
閱讀 1531·2019-08-29 12:13
閱讀 1410·2019-08-26 13:33
閱讀 884·2019-08-26 13:30