日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM

發布時間:2023/11/27 生活经验 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

一對一碰撞檢測

target是目標物體,move是移動物體


?情況1targetmove上角


?情況2targetmove右上角


情況3targetmove


?情況4targetmove右下角

重疊陰影面積算法

let width = (Math.min(tx2,mx2) - Math.max(tx1,mx1));???

let height = (Math.min(ty2,my2) - Math.max(ty1,my1));

let stackArea = (width > 0 ? width : 0) * (height > 0 ? height : 0);

stackAre=0代表沒有重疊;stackArea >0代表有交集

我們來點實際的代碼

//判斷兩個矩形DIV是否重疊----------------------------------------
function isOver(targetDom, moveDom) {if (targetDom === moveDom) return false;let tx1 = parseInt(targetDom.style.left);let ty1 = parseInt(targetDom.style.top);let tx2 = tx1 + parseInt(targetDom.style.width);let ty2 = ty1 + parseInt(targetDom.style.height);let mx1 = parseInt(moveDom.style.left);let my1 = parseInt(moveDom.style.top);let mx2 = mx1 + parseInt(moveDom.style.width);let my2 = my1 + parseInt(moveDom.style.height);let width = Math.min(tx2, mx2) - Math.max(tx1, mx1);let height = Math.min(ty2, my2) - Math.max(ty1, my1);let stackArea = (width > 0 ? width : 0) * (height > 0 ? height : 0);// ----------------------------------------    if (stackArea > 0) return true;return false;
}

??

一對多碰撞檢測

target是目標物體,move是移動物體

這里就需要去遍歷所有的target,計算每個重疊面積大小,挑出面積最大的那一個。

為了方便計算比較,我們通常是在上面的代碼基礎上加一個面積大小判斷,重疊面積超過target面積一半的情況就認為是碰撞對象

?//判斷多個矩形DIV是否重疊,并獲取最大的那個----------------------------------------
function isOverManyTarget(targetDom, moveDom) {if (targetDom === moveDom) return false;let tx1 = parseInt(targetDom.style.left);let ty1 = parseInt(targetDom.style.top);let tx2 = tx1 + parseInt(targetDom.style.width);let ty2 = ty1 + parseInt(targetDom.style.height);let mx1 = parseInt(moveDom.style.left);let my1 = parseInt(moveDom.style.top);let mx2 = mx1 + parseInt(moveDom.style.width);let my2 = my1 + parseInt(moveDom.style.height);let width = Math.min(tx2, mx2) - Math.max(tx1, mx1);let height = Math.min(ty2, my2) - Math.max(ty1, my1);let stackArea = (width > 0 ? width : 0) * (height > 0 ? height : 0);// ----------------------------------------//計算面積let measure = parseInt(targetDom.style.width) * parseInt(targetDom.style.height);let measureHalf = measure / 2;if (stackArea > measureHalf && stackArea <= measure) return targetDom;return null;
}

?

總結

以上是生活随笔為你收集整理的原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。