2016-05-04 14 views
-1

Ich arbeite an einem Problem in C++, wo ich den Winkel zwischen einer Linie als 2 Punkte in 3d (etc, x.y.z Koordinaten) und einem getrennten Punkt bestimmen muss. Hier sind einige Bilder, die leichter zu verstehen sind.Winkel zwischen einer Linie und einem Punkt in 3D berechnen

This is in 2D to display it easier

Also, was ich brauche Hilfe bei der Suche nach ist dieser Winkel

With angle

Ich habe für mehrere Stunden auf der Suche, dies jetzt zu lösen, und ich vermute, dass ich knapp verpasst habe etwas Offensichtliches. Aber wenn mir jemand helfen kann mit diesem werde ich sehr dankbar sein :)

+0

suggestiv das Bild direkt anstatt Verknüpfung Entsendung –

+1

zu imgUrl Haben Sie gehört, über math.stackexchange.com? Das ist da, du willst gehen. Beispiel: http://math.stackexchange.com/questions/413482/angle-between-different-rays-3d-line-segments-and-computing-their-angular-rela und http://math.stackexchange.com/ Fragen/463415/Winkel-zwischen-zwei-3d-Linien Hier diskutieren wir die Programmierung. – 4386427

+1

Computational Geometry ist eine Grauzone zwischen Mathematik und Programmierung.Bitte geh von deinem hohen Pferd. –

Antwort

-2

wir an, Sie haben einen (x , y , z) B (x , y , z) C (x , y , z 3) und der gemeinsame Punkt B. So ist die Gleichung der Geraden AB wird: (x1-x2)i + (y1-y2)j + (z1-z2)k, und dass für BC ist: (x2-x3)i + (y2-y3)j + (z2-z3)k

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

Hier ist der Code

#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

nur wenn jemand mir sagen könnte was falsch ist. –

+0

definieren Sie 'PI' nicht selbst! Es ist bereits in math.h, benutze 'M_PI' –

+0

, es wäre auch besser, Zwischenwerte zu verwenden, die' x1-x2', 'x2-x3' usw. entsprechen - der Code, den du hast, ist sehr anfällig für das Kopieren -paste Fehler. –

-1

Verwenden Sie die Law of Cosines:

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

wo asq und bsq die quadrierten Abstände zwischen dem Scheitelpunkt und die beiden anderen Punkte, und csq ist der quadratische Abstand zwischen diesen beiden Punkten.

(Zeichnung von Wikipedia)

+0

Warum der Downvote? Dies ist genau der Ansatz zu verwenden. OP muss noch 'asq',' bsq', 'csq' aus den ursprünglichen Koordinaten berechnen, aber das ist ziemlich einfach. –

2

Sie haben 2-Vektoren, bezogen auf ersten in 3D und andere Vektor Verbindungs ​​Endpunkt der Linie und einem Punkt in der 3D-Linie.

Zum Winkel theta zwischen zwei Vektoren zu berechnen, können Sie die Vorteile aus der Tatsache ziehen, dass V1.V2 = |V1| x |V2| x consine(theta)

Hier Code-Schnipsel ich aus here kopiert ist, Punktprodukt zu berechnen.

#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; 
} 

Sobald Sie das Punktprodukt haben, teilen sie durch Größenordnung von 2 Vektoren und dann inverse consine nehmen Theta zu bekommen.

+0

idk wer ist downvoting. Nicht ich. Dieser Ansatz funktioniert auch. –

Verwandte Themen