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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多边形碰撞检测(判断点在多边形内)

發布時間:2023/12/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多边形碰撞检测(判断点在多边形内) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點與規則的矩形或者等邊、等腰三角形等的碰撞檢測很簡單,本文主要是介紹“點與多邊不規則圖形的碰撞檢測”。

如圖,這個多邊形已經相當復雜,包含凸和凹,該如何解決呢?

結論:使用交點數判斷。即從碰撞點發射出一條水平射線,計算這條射線和多邊形的交點數,如果是奇數說明點在多邊形內部,反之則在外部。


代碼如下:

/*** JS 代碼* 判斷點是否在多邊形內* 求解通過該點的水平線與多邊形各邊的交點* 單邊交點為奇數,成立* IVector2:封裝數學庫,包含x,y兩個變量* Array:數組* @param pos 傳入點的坐標pos.x, pos.y* @param posPolygon 多邊形的各個頂點坐標* @param count 多邊形頂點的個數 */ public static PointInPolygon( pos:IVector2, posPolygon:Array<IVector2>, count:int ):boolean {let cross: int = 0; //交點個數for( let i = 0; i < count; i++ ){let p1: IVector2 = posPolygon[i];let p2: IVector2 = posPolygon[(i + 1) % count]; //下一個節點// p1p2這條邊與水平線平行if( p1.y == p2.y )continue;// 交點在p1p2的延長線上if( pos.y < Math.min( p1.y, p2.y ) )continue;// 交點在p1p2的延長線上if( pos.y > Math.max( p1.y, p2.y ) )continue;// 計算交點 X 左邊 : (p2.y - p1.y)/(p2.x - p1.x) = (y - p1.y)/(x - p1.x)// 直線 K 值相等, 交點y = pos.ylet x = (pos.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x// 只統計單邊交點,即點的正向方向if(x > pos.x)cross ++;}return cross % 2 == 1; }

?

總結

以上是生活随笔為你收集整理的多边形碰撞检测(判断点在多边形内)的全部內容,希望文章能夠幫你解決所遇到的問題。

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