2016-04-04 17 views
0

私はこのraytracerのソースコードを見ていました。ライン145でalgebra3.cppという名前のファイルに私たちは、この機能を見ることができます:この戻り値の型はなぜ有効ですか?

inline vec2 operator * (const mat3& a, const vec2& v) { 
    vec3 av; 

    av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]; 
    av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]; 
    av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]; 
    return av; 
} 

それはそのがvec3を返す代わりにvec2オブジェクトを返す必要があります。何故ですか?

+6

トップのソースコード:「1次元(2d、3d、または4d)のベクトルは、より高い次元または低い次元のベクトル にキャストできます。高次元へのキャストの場合、 の値が指定されていない限り、新しいコンポーネントはデフォルトで1.0に設定されます。 vec3 a(1.0、2.0、3.0); vec4 b(a、4.0); //今、b == {1.0、2.0、3.0、4.0}; 下位次元にキャストするとき、ベクトルは下位次元の で均質化されます。たとえば、4d {X、Y、Z、W}が3Dにキャストされた場合、結果のベクトルは{X/W、Y/W、Z/W}になります。キャストする前に、4番目のコンポーネントがゼロでないことを保証するのは、ユーザーには までです。 – EdChum

+0

ベクトルがさまざまな種類の上位/下位次元にキャストできると記載されています – EdChum

+0

エラーである場合があります。コンパイラがvec3からvec2に変換するようです。 –

答えて

1

vec3が暗黙的にvec2に変換可能な場合、関数はコンパイラが知っている限り正しくなります。

計算した直後にav.n[VZ]を捨てるのは馬鹿に思えます。それがプログラムの場合は、プログラマーの間違いかもしれないと推測します。

機能の詳細については、実際にvec3が返されるかどうか、または余分な計算が単にデッドコードに残っていて一時的なタイプがvec2であるかどうかを判断することは不可能です。あるいは、現在のコードがプログラマーが意図したものとまったく同じかどうか。

関連する問題