Есть две проблемы, с кодом, который разместил:
- Вы не указали, как
(a1,b1,c1)
и (a2,b2,c2)
установлены. Они должны быть:
- ортогональны
(xgp,ygp,zgp)
- ортогональны друг другу
- ортов
- В цикле сброса
(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 и убедиться, что вы знаете, какие подразделения вы намереваетесь.
Надеюсь, это поможет.
Обратите внимание, что в C++ (и многих других языках программирования) тригонометрические функции требуют угла в радианах, а не в градусах. Я говорю это из-за условия 't <360' в цикле, но вы также используете чрезвычайно малый приращение (0.0032), поэтому я не уверен в том, что вы делаете. Если 't' находится в градусах, вы можете использовать:' double angle = t * M_PI/180.0, ct = cos (angle), st = sin (angle); '. Я также обычно предпочитаю 'a2 * a2'' pow (a2,2) '. –
o, я этого не знал, спасибо. –