2016-07-16 4 views
0

Ich bekomme nicht die erforderliche Ausgabe, d. H. X2, y2, z2 in unteren Code. Hier ist der Winkel t in Grad, (x2, y2, z2) ist der Pint der Vektorfläche nach der Drehung und (a2, b2, c2) ist der Richtungskosinus des gedrehten Vektors. Ich benutzte rviz, um den rotierenden Vektor aber zu visualisieren es kommt nicht als Gedanke, dh es dreht sich nicht.Drehen eines Vektors mit parametrischen Gleichung von 3D-Kreis

double xgp[ipgp] = 23, ygp[ipgp] = 45, zgp[ipgp] = 345; int ipgp = 0; 
     double a2, b2 , c2, a1, b1, c1 = ... 
     double la = 0.0032; 
     for(double t=0;t<360;t+=la) 
     { 
      double x2 = xgp[ipgp]+a2*cos(t)+a1*sin(t); 
      double y2 = ygp[ipgp]+b2*cos(t)+b1*sin(t); 
      double z2 = zgp[ipgp]+c2*cos(t)+c1*sin(t); 
      a2 = x2-xgp[ipgp]; // vector (xgp,ygp,zgp)->(x2,y2,z2) 
      b2 = y2-ygp[ipgp]; 
      c2 = z2-zgp[ipgp]; 
      int i = round(sqrt(pow(a2,2)+pow(b2,2)+pow(c2,2))); 
      std::cout<<i<<std::endl; 
    } 
+0

Bitte beachten Sie, dass in C++ (und vielen anderen Programmiersprachen) die trigonometrischen Funktionen einen Winkel im Bogenmaß und nicht in Grad benötigen. Ich sage das wegen der Bedingung "t <360" in der Schleife, aber Sie verwenden auch ein extrem kleines Inkrement (0.0032), so dass ich nicht wirklich sicher bin, was Sie tun. Wenn "t" in Grad ist, können Sie verwenden: 'Doppelwinkel = t * M_PI/180.0, ct = cos (Winkel), st = sin (Winkel);'. Ich würde auch normalerweise 'a2 * a2' zu 'pow (a2,2)' bevorzugen. –

+0

o, das wusste ich nicht, danke. –

Antwort

0

Es gibt zwei Probleme mit dem Code, den Sie auf dem Laufenden:

  1. Sie hat nicht angegeben, wie (a1,b1,c1) und (a2,b2,c2) eingestellt sind. Diese müssen:
    • orthogonal zu (xgp,ygp,zgp)
    • orthogonal zueinander
    • Einheitsvektoren
  2. In der Schleife Sie (a2,b2,c2) zurückgesetzt der gedrehte Einheitsvektor zu sein. Sie können dies nicht tun und trotzdem die Orthogonalität zwischen (a1,b1,c1) und (a2,b2,c2) für den nächsten Schritt der Schleife beibehalten. Dies ist wahrscheinlich der Hauptgrund, warum Ihr Druck i aus nicht alle

Der folgende Code s 1‘tut, was Sie

#include <iostream> 
#include <math.h> 

int main() { 
    double xgp = 23., ygp = 45., zgp = 345.; 
    // setting (a2,b2,c2) to be orthogonal to (xgp,ygp,zgp) with unit magnitude 
    double a2 = -45./sqrt(23.*23. + 45.*45.); 
    double b2 = 23./sqrt(23.*23. + 45.*45.); 
    double c2 = 0.; 
    // setting (a1,b1,c1) to be orthogonal to both (a2,b2,c2) and (xgp,ygp,zgp) 
    // using cross product (xgp,ygp,zgp) X (a2,b2,c2) with unit magnitude 
    double a1 = -23.*345./sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.)); 
    double b1 = -45.*345./sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.)); 
    double c1 = (23.*23. + 45.*45.)/sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.)); 

    double la = 0.0032; 
    for(double t=0;t<360;t+=la) { 
    double x2 = xgp+a2*cos(t)+a1*sin(t); 
    double y2 = ygp+b2*cos(t)+b1*sin(t); 
    double z2 = zgp+c2*cos(t)+c1*sin(t); 
    // cannot overwrite a2, b2, c2; otherwise (a2,b2,c2) is no longer orthogonal to (a1,b1,c1)! 
    double a3 = x2-xgp; // vector (xgp,ygp,zgp)->(x2,y2,z2) 
    double b3 = y2-ygp; 
    double c3 = z2-zgp; 
    // (a3,b3,c3) is a unit vector! 
    int i = round(sqrt(pow(a3,2)+pow(b3,2)+pow(c3,2))); 
    std::cout<<i<<std::endl; 
    } 
    return(0) 
} 

Hinweis beabsichtigen, dass in Grad oder Radiant rotierenden spielt keine Rolle, in Bezug auf deine Frage. Sie sollten jedoch dem Rat von @Bob folgen und sicherstellen, dass Sie selbst wissen, welche Einheiten Sie beabsichtigen.

Hoffe, das hilft.

+0

ja, es hat mein Problem gelöst. –