自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 通過(guò)向量,計(jì)算移動(dòng)方向,計(jì)算線段角度等

開發(fā) 前端
我們可以通過(guò)計(jì)算線段的向量,來(lái)判斷手指(鼠標(biāo))在屏幕中的移動(dòng)方向。速度等信息。可以通過(guò)向量計(jì)算兩條線段的夾角度數(shù)等。

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)系)中的向量值:

public static void getVectors(Point p1,Point p2,Point p3,Point p4){
double ABx = p1.x - p2.x;
double ABy = p1.y - p2.y;
double CDx = p3.x - p4.x;
double CDy = p3.y - p4.y;

System.out.println("線段1的向量是: (" + ABx + ", " + ABy + ").");
System.out.println("線段2的向量是: (" + CDx + ", " + CDy + ").");

//向量的加法:
double[] sum = new double[2];
sum[0] = ABx + CDx;
sum[1] = ABy + CDy;
//得到的和sum就是一個(gè)新的向量了。是線段1和線段2的向量和。而減法也就是將+號(hào)跟換為-號(hào)而已。
}

我們得到的向量有什么用處呢?下面就是向量的一些簡(jiǎn)單使用場(chǎng)景了。

3. 計(jì)算線段和X軸的角度

假如,我們有兩個(gè)任意的坐標(biāo)點(diǎn),需要計(jì)算這兩個(gè)坐標(biāo)點(diǎn)連接的線段與X軸的夾角。

我們可以使用向量的知識(shí),很簡(jiǎn)單的得到這個(gè)角度:

public double getDegrees(Point p1, Point p2) {
//得到兩個(gè)坐標(biāo)點(diǎn)的差值, 其實(shí)得到的dx 和dy 就是我們線條的向量了
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
double angleRadians = Math.atan2(dy, dx); // 根據(jù)該方法,可以直接獲取坐標(biāo)點(diǎn)和x軸的夾角,返回的是一個(gè)-π到π之間的弧度值
double degrees = Math.toDegrees(angleRadians); //調(diào)用Math的API 將弧度轉(zhuǎn)為角度,角度值范圍為±180°。
return degrees;
}

在這個(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)軌跡了。

示例如下:

public static String getDegrees(Point p1, Point p2) {
//得到線段的向量
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
//得到線段和x軸的夾角弧度
double angleRadians = Math.atan2(dy, dx);
//zinyan.com 將弧度值轉(zhuǎn)為角度值
double degrees = Math.toDegrees(angleRadians);
//根據(jù)角度確定方向
if (degrees >= -45 && degrees < 45) {
return "right";//從右往左,也就是所謂的右邊進(jìn)入
} else if (degrees >= 45 && degrees < 135) {
return "up"; //從下往上 ,也就是所謂的上部進(jìn)入
} else if (degrees >= -135 && degrees < -45) {
return "down";//從上往下 ,也就是所謂的底部進(jìn)入
} else {
return "left"; //其他的就是左邊進(jìn)入的了, 從左往右移動(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)單,具體示例代碼如下:

//p1和p2 組合成線段1,p3和p4組合成線段2
public static double getDegress(Point p1,Point p2,Point p3,Point p4){
//這里是p2-p1也可以是p1-p2 位置是無(wú)所謂的,只是要統(tǒng)一。如果x軸是p2-p1,那么y軸也得是p2-p1
double d1x = p2.x - p1.x;
double d1y = p2.y - p1.y;
//這個(gè)的邏輯和上面一樣,p3-p4或者p4-p3都可以
double d2x = p4.x - p3.x;
double d2y = p4.y - p3.y;
//然后通過(guò)atan2 得到弧度,要注意了這個(gè)方法中必須是y軸值在前面,x軸值在后面
//兩個(gè)弧度相減,就是兩個(gè)線段的夾角弧度
double angle = Math.atan2(d1y, d1x) - Math.atan2(d2y, d2x);
//將弧度,轉(zhuǎn)為角度。并通過(guò)絕對(duì)值去除正負(fù)符號(hào)
angle = Math.abs(Math.toDegrees(angle));
if (angle > 180) {
//因?yàn)榫€段夾角內(nèi)角+外角=360°,
// 如果超過(guò)180°了說(shuō)明我們得到的是最大的外角了,而夾角應(yīng)該是最小的角度,所以進(jìn)行了360-angile
angle = 360 - angle;
}
return angle;
}

當(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ù)雜了。

責(zé)任編輯:武曉燕 來(lái)源: zinyan
相關(guān)推薦

2013-11-06 08:48:41

異構(gòu)計(jì)算移動(dòng)計(jì)算

2024-10-29 14:34:46

2010-03-31 15:03:12

云計(jì)算

2023-11-17 07:30:30

線段pgvector實(shí)踐

2021-11-05 11:03:33

云計(jì)算開發(fā)技術(shù)

2021-09-03 10:45:12

量子計(jì)算芯片超算

2011-12-14 10:33:35

云計(jì)算

2021-07-27 05:21:34

邊緣計(jì)算數(shù)據(jù)網(wǎng)絡(luò)

2012-12-12 09:37:12

移動(dòng)應(yīng)用移動(dòng)云計(jì)算云計(jì)算應(yīng)用

2012-07-13 09:17:26

移動(dòng)云計(jì)算

2015-08-18 11:10:01

云計(jì)算移動(dòng)管理移動(dòng)性

2021-03-04 08:00:00

移動(dòng)邊緣計(jì)算網(wǎng)絡(luò)混合云

2022-10-08 15:13:48

AI芯片

2020-05-08 15:27:06

物聯(lián)網(wǎng)云計(jì)算網(wǎng)絡(luò)攻擊

2020-03-20 10:40:04

云計(jì)算物聯(lián)網(wǎng)安全

2011-07-19 10:02:12

2013-10-08 11:16:55

谷歌云計(jì)算

2019-11-21 10:29:24

中科曙光

2012-05-02 13:52:30

IBM移動(dòng)產(chǎn)品

2010-06-07 10:44:09

點(diǎn)贊
收藏

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