我需要計算一個點的哪一邊是另一個點,我一直在谷歌上搜索,但我完全不知道所有這些數學方程是什么意思,或者它們如何轉化為代碼或更具體的JavaScript。
我有以下資訊:
- 點A:x、y和角度(點要去的方向)
- 點B:x、y和角度。
- 點B:x和y 。
現在我如何知道B點是在A點的左邊還是右邊?請用JavaScript回答。
uj5u.com熱心網友回復:
你有:
- 一個點A
(A.x, A.y); - 一個A的移動方向,以一個角度給出
A.angle; - 一個點B
(B.x, B.y)。
你想比較A的移動方向和矢量AB的方向。
矢量AB的坐標可以通過一個簡單的減法計算出來:
AB.x = B.x - A.x<
AB.y = B.y - A.y。
你可以使用atan2來計算方向矢量AB所對應的角度。方便的是,該函式是大多數編程語言的標準數學庫的一部分。
在使用atan2時,我們必須注意慣例。在評論中,你指定了你想要的北-順時針的慣例。關于其他慣例,請參閱Wikipedia: atan2 and conventions。
我們還必須將弧度轉換為度數,這可以通過轉換因子180 / pi輕松完成。
AB.angle = atan2(AB。 x, AB.y) * 180 / pi
if AB.angle < 0:
AB.angle = AB.angle 360
那么我們要做的就是檢查AB.angle是在區間[A.angle - 180°, A.angle](左邊),還是在區間[A.angle, A.angle 180°](右邊),同時要小心,因為所有的計算都是以180°為模。
// assuming A.angle > 0 & & A.angle < 360
if A.angle > 180:
if AB.angle > A。 angle - 180 && AB.angle < A.angle。
return "Left"
else:
return "Right": else: return "Right"
else: // A.angle < 180.
if AB.angle > A。 angle && AB.angle < A.angle 180:
return "Right"else:
uj5u.com熱心網友回復:
讓我們把它拆開。
- 我們有一條定向線L,穿過A點,方向為a(代表角度)。
- 我們有一個點B. 。
- 而問題是:B是在L的左邊還是右邊?
我們需要的是穿過A和B的直線(針對 "北",又稱正Y軸)的角度。這使我們可以比較這些角度:
如果你的0°角是 "向西,逆時針"(按照數學慣例),找到正確的數學方法會更容易,但我們只需交換x和y,就可以了(它們在下面幾行已經交換了!)。
我們從這些點上得到這個角度(我們稱之為b),但一開始,它將是弧度(而不是度數):
b_rad = Math. atan((A.x - B.x) / (A.y - B.y)) 。
你沒有指定這個角度是用度數還是弧度。假設是度,結果需要轉換為弧度:
你沒有指定角度是用度還是弧度。
b_deg = b_rad * (180 / Math.PI)。)
現在你只需要取差值:
delta = a_deg - b_deg;
并在我上面概述的比較中使用該delta。
(如果我沒想錯的話,這個數學運算給出的結果與需要的結果相反--在這種情況下,你需要在delta計算中交換a_deg和b_deg)
uj5u.com熱心網友回復:
考慮運算式的符號(如果angle的單位是度,則乘以Math.PI/180,得到弧度)
cross = (B.x - A.x)*Math. sin(angle)-(B.y - A.y)*Math.cos(angle)
右側為正值,左側為負值(反之亦然,取決于你的坐標系方向)
。uj5u.com熱心網友回復:
如果pointB.x < pointA.x它是在左邊的。
如果pointB.x > pointA.x 它在右邊。
如果它們是相等的,你就不能說誰在左邊或在右邊。
(當然,這是假設你的坐標空間在X軸上從左到右)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331078.html
標籤:
上一篇:無法在我的專案中安裝mini-css-extract插件
下一篇:C#數學
