2016-05-04 129 views
-1

我正在研究C++中的一個問題,我需要確定以3d(等,x.y.z座標)中的2點表示的線與斷開點之間的角度。以下是一些可能更容易理解的圖片。在3D中計算直線和點之間的角度

This is in 2D to display it easier

所以我需要的是找到這個角度

With angle

我一直在尋找了幾個小時,現在要解決這方面的幫助,我懷疑,我只是一直無緣一些明顯的事但是,如果任何人都可以幫我這個我會很感激:)

+0

建議張貼圖片,而不是直接鏈接到imgUrl的 –

+1

你聽說過math.stackexchange.com?那就是你想要去的地方。示例:http://math.stackexchange.com/questions/413482/angle-between-different-rays-3d-line-segments-and-computing-their-angular-rela和http://math.stackexchange.com/問題/ 463415/angle-between-two-3d-lines這裏我們討論編程。 – 4386427

+1

計算幾何是數學和編程之間的一個灰色區域。請放下你的高馬。 –

回答

-2

讓說你有A(X ,Y ,Z )B(X ,Y ,Z )C(X ,Y ,Z )和共同的一點是B.因此,線AB變爲方程:(x1-x2)i + (y1-y2)j + (z1-z2)k並且對於BC,它是:(x2-x3)i + (y2-y3)j + (z2-z3)k

COS theta = (AB.BC)/(|AB|*|BC|)

下面是代碼

#include<iostream> 
#include<math.h> 
#define PI 3.14159265 
using namespace std; 
int main() 
{ 
    int x1,x2,x3,y1,y2,y3,z1,z2,z3; 
    cout<<"for the first\n"; 
    cin>>x1>>y1>>z1; 
    cout<<"\nfor the second\n"; 
    cin>>x2>>y2>>z2; 
    cout<<"\nfor the third\n"; 
    cin>>x3>>y3>>z3; 
    float dot_product = (x1-x2)*(x2-x3) + (y1-y2)*(y2-y3)+ (z1-z2)*(z2-z3); 
    float mod_denom1 = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2)); 
    float mod_denom2 = sqrt((x2-x3)*(x2-x3) + (y2-y3)*(y2-y3) + (z2-z3)*(z2-z3)); 
    float cosnum = (dot_product/((mod_denom1)*(mod_denom2))); 
    float cos = acos(cosnum)*180/PI; 
    cout<< cos; 
} 
+0

只有當有人能告訴我什麼是錯的。 –

+0

不要自己定義「PI」!它已經在math.h中,使用'M_PI' –

+0

,使用等於'x1-x2','x2-x3'等的中間值也會更好 - 您的代碼非常容易複製 - 膏體錯誤。 –

-1

使用Law of Cosines

gamma = acos((asq + bsq - csq)/2/sqrt(asq*bsq)) 

其中asqbsq是頂點,其他兩個點之間的距離平方和csq是這兩點之間的平方距離。

(從Wikipedia繪製)

+0

爲什麼downvote?這正是使用的方法。 OP仍然需要從原始座標計算'asq','bsq','csq',但這很簡單。 –

2

您有2個向量,第一相關在3D和行和在3D的點的其它載體連接端點到線。

爲了計算角度矢量theta 2之間,可以採取的我從here複製的事實,即V1.V2 = |V1| x |V2| x consine(theta)

這裏是代碼段的優勢,來計算點積。

#include<numeric>  

int main() { 
    double V1[] = {1, 2, 3}; // vector direction i.e. point P2 - point P1 
    double V2[] = {4, 5, 6}; // vector direction i.e. point P3 - point P2 

    std::cout << "The scalar product is: " 
       << std::inner_product(begin(V1), end(V1), begin(V2), 0.0); 

    // TODO: Get theta 

    return 0; 
} 

一旦你有了點積,將它除以2個矢量的大小,然後採取反餘弦得到theta。

+0

idk誰downvoting。不是我。這種方法也適用。 –