2012-03-21 149 views
2

我有一個cathesian二維繫統中的兩個點,都給了我一個向量的起點和終點。現在我需要新矢量和x軸之間的角度。我知道gradient =(y2-y1)/(x2-x1),我知道angle = arctan(gradient)。從x軸向量計算角度(梯度)

但我不知道這是否適用於每個案件(方向)載體需要。 我什麼時候需要添加180度或類似的東西。

任何人都可以爲我提供一些c/java代碼或所有情況下的提示。

THX和問候

+1

「任何人都可以爲我提供一些類似c/java的代碼」不是一個問題。向我們展示一些代碼,描述您的困難,我們將幫助您改進它。 – abelenky 2012-03-21 20:02:52

+0

[查找兩點之間的角度,相對於水平軸?]可能的重複(http://stackoverflow.com/questions/7829010/find-angle-between-two-points-respective-to-horizo​​ntal-axis) – 2012-03-21 20:07:21

回答

6

你可以使用點積(http://en.wikipedia.org/wiki/Dot_product),但簡化了這一切,你最終只是把你的矢量的終點的反正就可以獲得它和之間的夾角x軸。 Atan函數通常以[-pi,pi]或[-180,180]的順序返回,所以如果你想確保它正確包裝,你需要檢查你的向量的y分量是否爲負值。在C中,可以使用atan2而不是atan,並使用每個組件的符號來計算角度的符號(http://www.cplusplus.com/reference/clibrary/cmath/atan2/)。例如,如果您具有矢量點start = < 1,2>和end = < -5,-5>,則通過從結尾減去開始將其調回原點,從而爲您提供< -6 ,-7>。所以你在看那個點。與x軸的角度是atan2(y,x),atan2(-7,-6),這是-130.6。

double x = -6; 
double y = -7; 

fprintf(stderr,"angle is %.2f\n",atan2(y,x)*180/3.14159); 

角度爲-130.60

+3

Long故事短 - 你想atan2。 – rutgersmike 2012-03-21 20:14:30

0

所以總結一下,當你有一個二維的XY載體,需要找到一個0 \ 360度到正x軸你這樣做:

const float RAD2DEG = 180.0f/3.14159f; 

float x = -4.0f; 
float y = 3.2f; 

// atan2 receives first Y second X 
double angle = atan2(y, x) * RAD2DEG; 
if (angle < 0) angle += 360.0f;