2013-04-29 2 views
0

Я пишу программу, где мне нужно повернуть o точку. Но что-то в расчетах неверно.Sin, cos, radian и вращать

Это функция для вращения (Y-ось):

point3 rotY(point3 a, float angle){ 
    float x,z; 
    z=a.z*cos(angle)-a.x*sin(angle); 
    x=a.z*sin(angle)+a.x*cos(angle); 
    a.z=z; 
    a.x=x; 
    return a; 
} 

Это point3 структура:

struct point3{ 
float x,y,z; 
point3(){ 
    x=y=z=0.0f; 
} 
point3(float a,float b,float c){ 
    x=a;y=b;z=c; 
} 
}; 

телефонный код:

point3 a(0.0f,l,0.0f); 
    a=rotX(a,S->angle*rad); 
    std::vector <point3> pocz(S->amount); 
    for(int i=0;i<S->amount;i++) 
     pocz[i]=rotY(a,(i*(360.0f/S->amount))*rad); 

Это (i*(360.0f/S->amount))*rad является вращение как на этой картинке enter image description here

Я знаю, что для expample когда a.x=0.0f, a.y=2.36880779 и a.z=2.36880779 и я хочу, чтобы повернуть его на 180 градусов эта функция возвратит a.x=-2.07087751e-007, a.y=2.36880779 и a.z=-2.36880779.

Но он должен вернуть a.x=0.0, a.y=2.36880779 и a.z=-2.36880779.

Что может быть неправильным здесь?

+0

Можете ли вы дать нам вызов ROTY? – Vincent

+3

Если вы имеете в виду '-2.07087751e-007' против' 0', нет ничего плохого. 'sin' и' cos' чисел с плавающей запятой не могут дать точных результатов. – kennytm

+0

Это обычная ошибка округления, когда речь идет о числах с плавающей и двойной точками. – Nomad101

ответ

3

Здесь ничего плохого: арифметика с плавающей точкой является приблизительной (до 6 цифр). Более подробную информацию по теме: http://support.microsoft.com/kb/125056

Как заявил juanchopanza, вы можете переключиться на двойной: http://en.wikipedia.org/wiki/Double-precision_floating-point_format

+0

Не ошибетесь позже (когда я буду использовать эти коорды для следующих преобразований)? – Antua

+0

@Antua хорошо, эти небольшие различия могут распространяться и в конечном итоге вызывать большие ошибки. Чтобы справиться с этим, вы можете начать с того, что делаете все в 'double' вместо' float'. – juanchopanza

+0

Спасибо за вашу помощь. Ребята – Antua

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