最近在作的一款遊戲中,用到點與旋轉矩形的斷定來得到一個選中的物體。在此作個記錄
如圖所示,黃色的顏料屏是旋轉的,若是不作處理直接判斷點是否在矩形中,那麼點擊紅點的位置會斷定爲選中物體。顯然這是不對的。
若是物體沒有旋轉,判斷方法就很簡單了。html
static isPositionInRect(point: cc.Vec2, rect: cc.Rect) { return point.x <= rect.x + rect.width/2 && point.x >= rect.x - rect.width/2 && point.y <= rect.y + rect.height /2&& point.y >= rect.y - rect.height /2; }
我這個矩形錨點爲爲(0.5,0.5),若是錨點不是(0.5,0.5)能夠自行修改。
可是判斷一個點在旋轉後的矩形中就沒有這麼簡單了。node
x2 = x * cos(O) - y * sin(O) y2 = x * sin(O) + y * cos(O)
獲得了這個公式,咱們接下來就是要旋轉觸摸點了。不過這個時候咱們要肯定要繞哪一個點旋轉,是座標系的原點嗎?不是的,而是咱們要碰撞的矩形的中心點,由於矩形是繞這個點旋轉的。
編程
最終咱們獲得一個完整的斷定函數微信
/** * 判斷點是否在旋轉後的矩形中 * @param point 觸摸點的座標 * @param node 碰撞節點,錨點必須爲(0.5,0.5) */ static isPosInRotationRect(point: cc.Vec2, node: cc.Node) { let hw = node.width / 2; let hh = node.height / 2 let O = node.angle; let center = node.position; let X = point.x let Y = point.y let r = -O * (Math.PI / 180) let nTempX = center.x + (X - center.x) * Math.cos(r) - (Y - center.y) * Math.sin(r); let nTempY = center.y + (X - center.x) * Math.sin(r) + (Y - center.y) * Math.cos(r); if (nTempX > center.x - hw && nTempX < center.x + hw && nTempY > center.y - hh && nTempY < center.y + hh) { return true; } return false }
以上就是如何斷定一個點在旋轉後的矩形中的一種方式。在網上搜索的時候發現有不少種實現方式,可是感受都比較繁瑣。有興趣的小夥伴能夠本身去研究研究。不過用我這個斷定函數已經能夠達到目的了。函數
歡迎掃碼關注公衆號《微笑遊戲》,瀏覽更多內容。.net