2016-07-16 4 views
0

Я не получаю требуемый выход i.e x2, y2, z2 в нижнем коде. Здесь угол t находится в степени, (x2, y2, z2) является пиной векторной грани после поворота и (a2, b2, c2) является косинусом направления вращения вектора. Я использовал rviz для визуализации вращающегося вектора, но это не значит, что он не вращается.Вращение вектора с использованием параметрического уравнения 3d-круга

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

Обратите внимание, что в C++ (и многих других языках программирования) тригонометрические функции требуют угла в радианах, а не в градусах. Я говорю это из-за условия 't <360' в цикле, но вы также используете чрезвычайно малый приращение (0.0032), поэтому я не уверен в том, что вы делаете. Если 't' находится в градусах, вы можете использовать:' double angle = t * M_PI/180.0, ct = cos (angle), st = sin (angle); '. Я также обычно предпочитаю 'a2 * a2'' pow (a2,2) '. –

+0

o, я этого не знал, спасибо. –

ответ

0

Есть две проблемы, с кодом, который разместил:

  1. Вы не указали, как (a1,b1,c1) и (a2,b2,c2) установлены. Они должны быть:
    • ортогональны (xgp,ygp,zgp)
    • ортогональны друг другу
    • ортов
  2. В цикле сброса (a2,b2,c2) быть повернуты единичный вектор. Вы не можете этого сделать и по-прежнему поддерживать ортогональность между (a1,b1,c1) и (a2,b2,c2) для следующего шага цикла. Это, вероятно, главная причина, почему ваша печать из i не все 1 «s

Следующий код делает то, что вы собираетесь

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

Обратите внимание, что вращающиеся в единицах градусов или радианах не имеет значения с точки зрения вашего вопроса. Тем не менее, вам следует следовать советам @Bob и убедиться, что вы знаете, какие подразделения вы намереваетесь.

Надеюсь, это поможет.

+0

Да, это решило мою проблему. –

Смежные вопросы