java矩形翻转_如何判断一个点在旋转后的矩形中
前言
最近在做的一款游戲中,用到點(diǎn)與旋轉(zhuǎn)矩形的判定來獲得一個(gè)選中的物體。在此做個(gè)記錄
如圖所示,黃色的顏料屏是旋轉(zhuǎn)的,如果不做處理直接判斷點(diǎn)是否在矩形中,那么點(diǎn)擊紅點(diǎn)的位置會(huì)判定為選中物體。顯然這是不對(duì)的。
如果物體沒有旋轉(zhuǎn),判斷方法就很簡單了。
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;
}
我這個(gè)矩形錨點(diǎn)為為(0.5,0.5),如果錨點(diǎn)不是(0.5,0.5)可以自行修改。
但是判斷一個(gè)點(diǎn)在旋轉(zhuǎn)后的矩形中就沒有這么簡單了。
怎么判斷呢?
首先我想到的是WebGL編程指南第92頁講到的內(nèi)容。(x,y)在旋轉(zhuǎn)O角度后得到(x2,y2)
x2 = x * cos(O) - y * sin(O)
y2 = x * sin(O) + y * cos(O)
得到了這個(gè)公式,我們接下來就是要旋轉(zhuǎn)觸摸點(diǎn)了。不過這個(gè)時(shí)候我們要確定要繞哪個(gè)點(diǎn)旋轉(zhuǎn),是坐標(biāo)系的原點(diǎn)嗎?不是的,而是我們要碰撞的矩形的中心點(diǎn),因?yàn)榫匦问抢@這個(gè)點(diǎn)旋轉(zhuǎn)的。
最終我們得到一個(gè)完整的判定函數(shù)
/**
* 判斷點(diǎn)是否在旋轉(zhuǎn)后的矩形中
* @param point 觸摸點(diǎn)的坐標(biāo)
* @param node 碰撞節(jié)點(diǎn),錨點(diǎn)必須為(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
}
這里邊需要注意的是角度O我們用的是反方向的。因?yàn)槲覀兣卸ㄊ褂玫木匦蔚淖鴺?biāo)和寬高是未旋轉(zhuǎn)的,也就是下圖的紅色框。所以我們的觸摸點(diǎn)需要反方向旋轉(zhuǎn)角度O才能使用之前的判定方法。
當(dāng)你點(diǎn)擊了1的位置,經(jīng)過反方向的旋轉(zhuǎn)后會(huì)到達(dá)2的位置,然后與紅色框的矩形判斷,才會(huì)得到正確的判定結(jié)果。如果觸摸點(diǎn)旋轉(zhuǎn)的角度與矩形旋轉(zhuǎn)的角度相同,那么點(diǎn)擊1的位置就會(huì)向左移動(dòng),也會(huì)判定為選中,就會(huì)得到不正確的結(jié)果了。
結(jié)語
以上就是如何判定一個(gè)點(diǎn)在旋轉(zhuǎn)后的矩形中的一種方式。在網(wǎng)上搜索的時(shí)候發(fā)現(xiàn)有很多種實(shí)現(xiàn)方式,但是感覺都比較繁瑣。有興趣的小伙伴可以自己去研究研究。不過用我這個(gè)判定函數(shù)已經(jīng)可以達(dá)到目的了。
總結(jié)
以上是生活随笔為你收集整理的java矩形翻转_如何判断一个点在旋转后的矩形中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql异步查询 java_基于 my
- 下一篇: ios格式用u盘怎么安装 如何使用U盘安