フレームワーク固有の型を使用する際に留意すべき要因は何ですか?

関数呼び出しで3つの浮動小数点数を使用するのではなく、 D3DXVECTOR3 (directX 3倍浮動小数点数)を使用するなど、プロとは何ですか?

そう

Scale(D3DXVECTOR3(1, 1, 1));

とは対照的に

Scale(1, 1, 1);

ライブラリ固有の数学関数を使用する必要がある場合は、2番目を使用して D3DXVECTOR3 に変換する方が良いでしょうか?

I alそうnotice that many libraries have their own types for floats and doubles and そうon. thoughts?

2

1 答え

浮動体の代わりに浮動体の構造をAPIに受け入れる大きな理由の1つは、可読性です。 3Dグラフィックスを使用するアプリケーションでは、確かに多くのベクトルで作業する必要があります。これは、より読みやすく保守しやすい方法です。

D3DXVECTOR Scale(D3DXVECTOR a, double scale)
{
    return D3DXVECTOR(a.x * scale, a.y * scale, a.z * scale);
}

class MyClass
{
public:
    void DoSomething()
    {
        a = Scale(b, 2.0);
        ::D3DXVec3Cross(&out, &a, &b);
    }

private:
    D3DXVECTOR3 out;
    D3DXVECTOR3 a;
    D3DXVECTOR3 b;
};

これより:

class MyClass
{
public:
    void DoSomething()
    {
        float scale = 2.0;
        a1 = Scale(b1, scale);
        a2 = Scale(b2, scale);
        a3 = Scale(b3, scale);
       //Hypothetical D3DX function accepting floats directly
        ::D3DXVec3Cross(&out1, &out2, &out3, a1, a2, a3, b1, b2, b3);
    }

private:
    float out1;
    float out2;
    float out3;
    float a1;
    float a2;
    float a3;
    float b1;
    float b2;
    float b3;
};

言い換えれば、それは自己文書化コードを可能にする。 ( float の3つの個別のコードではなく D3DXVECTOR )を宣言する必要があるときに入力する時間が少なくて済みます。

つまり、3Dグラフィックスライブラリ/フレームワークでは、異なるプラットフォームや構成間での移植性のために、独自のベクタータイプと浮動小数点タイプを定義します。次のようにこれらのタイプを単純に定義することができます。

namespace My3DLib
{

    typedef MyFloat float;

    struct MyVector
    {
        MyFloat x;
        MyFloat y;
        MyFloat z;
    };

    MyVector Scale(MyVector a, MyFloat b);
    MyFloat DotProduct(MyVector a, MyVector b);
    MyVector CrossProduct(MyVector a, MyVector b);
  //...
}
1
追加された