Java 通過(guò)向量,計(jì)算移動(dòng)方向,計(jì)算線段角度等
1. 簡(jiǎn)介
向量是指在數(shù)學(xué)中用于表示大小和方向的量。在計(jì)算機(jī)科學(xué)中,向量通常用于表示物體的位置、速度和加速度等。在Java中,可以使用坐標(biāo)系中兩點(diǎn)之間的差異來(lái)計(jì)算向量之間的距離。
在二維空間中,向量通常表示為一個(gè)有序的數(shù)對(duì)(x, y),其中x和y分別表示向量在x軸和y軸上的分量。例如,向量(3, 4)表示一個(gè)向右3個(gè)單位和向上4個(gè)單位的向量。在三維空間中,向量通常表示為一個(gè)有序的三元組(x, y, z),其中x、y和z分別表示向量在x、y和z軸上的分量。
我們可以通過(guò)計(jì)算線段的向量,來(lái)判斷手指(鼠標(biāo))在屏幕中的移動(dòng)方向。速度等信息??梢酝ㄟ^(guò)向量計(jì)算兩條線段的夾角度數(shù)等。
2. 獲取線段的向量
向量可以進(jìn)行加法和減法運(yùn)算。向量的加法運(yùn)算是將兩個(gè)向量的分量相加,得到一個(gè)新的向量。向量的減法運(yùn)算是將一個(gè)向量的分量減去另一個(gè)向量的分量,得到一個(gè)新的向量。
而我們?nèi)绾瓮ㄟ^(guò)坐標(biāo)獲取線段的向量呢?很簡(jiǎn)單x1-x2 就是向量x,y1-y2就是向量y。合起來(lái)就是向量在二維平面(直角坐標(biāo)系)中的向量值:
我們得到的向量有什么用處呢?下面就是向量的一些簡(jiǎn)單使用場(chǎng)景了。
3. 計(jì)算線段和X軸的角度
假如,我們有兩個(gè)任意的坐標(biāo)點(diǎn),需要計(jì)算這兩個(gè)坐標(biāo)點(diǎn)連接的線段與X軸的夾角。
我們可以使用向量的知識(shí),很簡(jiǎn)單的得到這個(gè)角度:
在這個(gè)方法中,我們傳入的坐標(biāo)點(diǎn)的Y值的大小,決定了角度的正負(fù)數(shù)。
如果p1的Y值大于p2,返回的就是:-179°~0 中間的值。
如果p1的Y值小于p2,返回的就是:0~180°中間的值。
我們?nèi)绻Y(jié)合手機(jī)或者電腦屏幕的坐標(biāo)來(lái)計(jì)算。
簡(jiǎn)單理解就是,點(diǎn)p1在p2的上方,那么計(jì)算的就是從x軸出發(fā)順時(shí)針的角度,也就是0~180°
而點(diǎn)p1在點(diǎn)p2的下方,那么計(jì)算的就是從x軸出發(fā),逆時(shí)針的角度。也就是-179°~0。(因?yàn)?80°的時(shí)候,p1和p2平行,無(wú)所謂順時(shí)針逆時(shí)針)。
4. 根據(jù)用戶移動(dòng)軌跡,判斷用戶的移動(dòng)方向
在上面計(jì)算了線段和X軸的夾角。我們其實(shí)可以根據(jù)這個(gè)角度,判斷計(jì)算用戶的移動(dòng)軌跡。也就能得到用戶手指或者鼠標(biāo)的移動(dòng)軌跡了。
示例如下:
上面的角度比較值,其實(shí)45度比較好理解。我們平面畫一條直線當(dāng)做X軸。線條上面的就是0~-180°,線條下面的就是0~180°
然后畫一個(gè)米字格,每個(gè)線段的夾角就是45°。那么右邊就是±45°。上面就是45°~135°了(PS:135=45+45+45)。
5. 通過(guò)向量和角度,計(jì)算兩個(gè)線條的夾角
在前面,我們計(jì)算了如何獲取線條和X軸的夾角。我們?nèi)绻袃蓷l線段,那么如何獲取這兩條線段的夾角呢?
處理邏輯很簡(jiǎn)單,例如線段1和x軸的夾角是90°,線段2和x軸的夾角是130°。那么線段1和線段2的夾角應(yīng)該是:130°-90°=40°
使用x軸當(dāng)做基準(zhǔn)點(diǎn),進(jìn)行處理,你會(huì)發(fā)現(xiàn)運(yùn)算邏輯很簡(jiǎn)單,具體示例代碼如下:
當(dāng)我們使用向量和Math的API。你會(huì)發(fā)現(xiàn)計(jì)算角度等會(huì)很方便
Math.atan2() 方法返回從 X 軸到指定坐標(biāo)點(diǎn) (x,y) 之間的角度(以弧度為單位)。它是 Math.atan(y/x)的安全版,可以避免除數(shù)為 0 的情況。
6. 小結(jié)
關(guān)于向量也就是這些了。還有更多復(fù)雜的使用場(chǎng)景。這里就不擴(kuò)展了,太復(fù)雜了。