成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

幾何算法:矩形碰撞和包含檢測(cè)算法

開發(fā) 前端
所謂包圍盒子是一個(gè)矩形,通常正好包圍住一個(gè)規(guī)則或不規(guī)則的圖形。如果兩個(gè)圖形的包圍盒沒有發(fā)生碰撞,那這兩個(gè)圖形一定不會(huì)發(fā)生碰撞,因?yàn)榫匦蔚呐鲎菜惴ê芎唵危阅軌蚝芎玫貎?yōu)化性能。

大家好,我是前端西瓜哥。今天來講講幾何算法中,比較經(jīng)典的算法:矩形碰撞和包含檢測(cè)算法。

矩形碰撞檢測(cè)是被廣泛使用的算法。

比如在游戲中,為了優(yōu)化圖形碰撞判斷效率(復(fù)雜不規(guī)則圖形之間的碰撞算法很復(fù)雜),經(jīng)常會(huì)使用到包圍盒。

所謂包圍盒子是一個(gè)矩形,通常正好包圍住一個(gè)規(guī)則或不規(guī)則的圖形。如果兩個(gè)圖形的包圍盒沒有發(fā)生碰撞,那這兩個(gè)圖形一定不會(huì)發(fā)生碰撞,因?yàn)榫匦蔚呐鲎菜惴ê芎唵危阅軌蚝芎玫貎?yōu)化性能。

算法實(shí)現(xiàn)

考慮到有些讀者對(duì)原理不感興趣,想趕緊找到算法復(fù)制粘貼,很急,我這里先直接貼上代碼實(shí)現(xiàn)。

判斷矩形是否碰撞:

function isRectIntersect(rect1, rect2) {
return (
rect1.x <= rect2.x + rect2.width &&
rect1.x + rect1.width >= rect2.x &&
rect1.y <= rect2.y + rect2.height &&
rect1.y + rect1.height >= rect2.y
);
}

判斷矩形 1 是否包含矩形 2:

function isRectContain(rect1, rect2) {
return (
rect1.x <= rect2.x &&
rect1.x + rect1.width >= rect2.x + rect2.width &&
rect1.y <= rect2.y &&
rect1.y + rect1.height >= rect2.y + rect2.height
);
}

矩形碰撞檢測(cè)原理

首先明確矩形的定義。我們用 4 個(gè)屬性來描述一個(gè)矩形,分別為 x、y、width、height,表示矩形的左上角位置和尺寸。

這里用主流的坐標(biāo)系統(tǒng)表示,以屏幕左上角為原點(diǎn),x軸正方向向右,y 軸正方形向下。

圖片

或者我們可以用 minX、minY、maxX,minY 來表示:

圖片

矩形碰撞,也叫矩形相交。矩形發(fā)生碰撞的條件是:兩個(gè)矩形有重疊的區(qū)域。

下圖是兩個(gè)矩形碰撞的一些情況:

圖片

先看 x 維度,將兩個(gè)矩形往 x 軸線上投影,我們得到兩條線段。

圖片

矩形要相交,首先 x 的范圍上就應(yīng)該有交集,等價(jià)于判斷兩個(gè)線段是否有交點(diǎn)。

先看看什么情況下它們 不會(huì)相交?答案是:一條線段的右端點(diǎn)在另一條線的的左端點(diǎn)的左側(cè)。

所以相交的邏輯是:

!(rect1.x > rect2.x + rect2.width || rect1.x + rect1.width < rect2.x)

轉(zhuǎn)換一下,就是:

rect1.x <= rect2.x + rect2.width &&
rect1.x + rect1.width >= rect2.x

y 維度同理,為:

rect1.y <= rect2.y + rect2.height &&
rect1.y + rect1.height >= rect2.y

所以最終算法實(shí)現(xiàn)為:

function isRectIntersect(rect1: IRect, rect2: IRect) {
return (
rect1.x <= rect2.x + rect2.width && // minX1 <maxX
rect1.x + rect1.width >= rect2.x &&
rect1.y <= rect2.y + rect2.height &&
rect1.y + rect1.height >= rect2.y
);
}

矩形包含原理

思路類似矩形碰撞。

圖片

也是判斷兩條線段的位置關(guān)系,rect 1 包含 rect 2,首先在 x 維度上需要滿足 rect 2 的兩個(gè)點(diǎn)都在 rect 1 的 x 范圍內(nèi)。

代碼為:

rect1.x <= rect2.x &&
rect1.x + rect1.width >= rect2.x + rect2.width

y 同理,最終代碼實(shí)現(xiàn)為:

function isRectContain(rect1, rect2) {
return (
rect1.x <= rect2.x &&
rect1.x + rect1.width >= rect2.x + rect2.width &&
rect1.y <= rect2.y &&
rect1.y + rect1.height >= rect2.y + rect2.height
);
}

結(jié)尾

矩形算法的碰撞和包含算法,思路是降低維度,分解為判斷線段的相交關(guān)系。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2009-07-15 10:40:06

碰撞檢測(cè)算法Java ME

2024-04-28 11:42:39

Python模型數(shù)據(jù)

2020-11-10 15:22:46

算法PythonIoU

2017-09-20 16:25:00

深度學(xué)習(xí)視覺領(lǐng)域計(jì)算機(jī)

2018-01-23 16:16:03

開源技術(shù) Facebook

2020-11-02 11:24:52

算法人臉識(shí)別技術(shù)

2018-09-17 15:30:05

機(jī)器學(xué)習(xí)密度異常值

2024-04-26 10:00:03

自動(dòng)駕駛模型

2023-11-13 22:17:54

YOLO-NAS目標(biāo)檢測(cè)

2020-12-24 19:01:14

iForest大數(shù)據(jù)檢測(cè)算法

2024-06-05 09:26:50

2021-07-24 11:23:41

算法開源技術(shù)

2024-05-30 12:50:54

2020-10-18 07:15:53

Python異常檢測(cè)算法開發(fā)

2022-03-07 10:04:09

機(jī)器學(xué)習(xí)訓(xùn)練模型

2022-12-26 07:37:14

四叉樹Canvas

2020-11-02 13:44:35

算法數(shù)據(jù)科學(xué)Python

2025-02-17 07:00:00

ORB對(duì)象跟蹤器計(jì)算機(jī)視覺

2022-02-14 11:37:59

自動(dòng)駕駛算法技術(shù)

2021-03-31 11:20:57

PythonADTK異常檢測(cè)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一本一道久久a久久精品综合蜜臀 | 一区二区三区视频在线观看 | 国产精品成人一区二区 | 毛色毛片免费看 | 精品久久久久久亚洲精品 | 国产精品九九九 | 91精品www | 偷拍自拍在线观看 | 特a毛片 | 中文字幕 在线观看 | 中文字幕一区二区三区四区五区 | 亚洲 欧美 综合 | 日日天天| 日韩视频精品 | 国产丝袜一区二区三区免费视频 | 日韩欧美视频 | 国产美女黄色片 | 最近中文字幕在线视频1 | 毛片毛片毛片毛片毛片 | 台湾佬成人网 | 天天色天天色 | 久久久国产一区二区 | 视频在线观看一区二区 | 精品无码久久久久久国产 | 噜啊噜在线 | 国产精久久久久久久妇剪断 | 成人av一区二区亚洲精 | 日韩精品在线播放 | a级大片免费观看 | 欧美久久久久 | 一区二区三区四区在线视频 | 成人免费淫片aa视频免费 | 亚洲九九精品 | 久久国内精品 | 中文字幕 在线观看 | 国产japanhdxxxx麻豆 | 国产综合精品一区二区三区 | 91九色视频 | 久久精品 | 亚洲乱码一区二区三区在线观看 | www久久国产 |