0

ポイントを回転させる必要があるプログラムを書いています。しかし、計算上の何かが正しくありません。

それは回転する関数です(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は、この写真のように回転していますここに画像の説明を入力

たとえば、 、および を 180 度回転させたい場合 、a.x=0.0fこの関数は 、およびを返します。a.y=2.36880779a.z=2.36880779a.x=-2.07087751e-007a.y=2.36880779a.z=-2.36880779

しかし、それはa.x=0.0a.y=2.36880779およびを返す必要がありa.z=-2.36880779ます。

ここで何が問題なのですか?

4

1 に答える 1

3

ここに問題はありません: 浮動小数点演算は概算です (最大 6 桁)。この件に関する詳細情報: http://support.microsoft.com/kb/125056

juanchopanza が述べたように、 double に切り替えることができます: http://en.wikipedia.org/wiki/Double-precision_floating-point_format

于 2013-04-29T08:46:05.553 に答える