2016-04-04 6 views
0

Ich habe mir den Quellcode dieser raytracer angesehen. Auf der Datei algebra3.cpp in Zeile 145 Namen können wir diese Funktion sehen:Warum ist dieser Rückgabetyp gültig?

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; 
} 

Es stattdessen ein vec2 Objekt zurückgeben sollte ich ein vec3 zurück. Warum das?

+6

Der Quellcode oben lautet: 'Ein Vektor einer Dimension (2d, 3d oder 4d) kann in einen Vektor einer höheren oder niedrigeren Dimension umgewandelt werden. Bei der Umwandlung in eine höhere Dimension wird die neue Komponente standardmäßig auf 1.0 gesetzt, es sei denn, ein Wert ist angegeben: vec3 a (1.0, 2.0, 3.0); vec4b (a, 4,0); // jetzt b == {1.0, 2.0, 3.0, 4.0}; Beim Gießen in eine niedrigere Dimension wird der Vektor in der unteren Dimension homogenisiert. Wenn z. B. ein 4d {X, Y, Z, W} in 3d umgewandelt wird, ist der sich ergebende Vektor {X/W, Y/W, Z/W}. Es liegt an dem Benutzer sicherzustellen, dass die vierte Komponente vor dem Gießen nicht Null ist. ' – EdChum

+0

Es besagt, dass die Vektoren auf verschiedene Arten von höheren/niedrigeren Dimensionen umgewandelt werden können – EdChum

+0

Könnte ein Fehler sein, könnte absichtlich sein. Sieht so aus, als ob der Compiler von vec3 zu vec2 konvertiert. –

Antwort

1

Wenn vec3 implizit in vec2 konvertierbar ist, dann ist die Funktion soweit korrekt, wie der Compiler weiß.

Es wäre albern, av.n[VZ] direkt nach der Berechnung wegzuwerfen. Wenn das das Programm ist, werde ich raten, dass es ein Programmierfehler sein könnte.

Ohne weitere Informationen darüber, was die Funktion tun soll, ist es unmöglich zu sagen, ob es tatsächlich eine vec3 zurückgeben soll, oder ob die zusätzliche Berechnung einfach ein toter Code ist und das temporäre vom Typ vec2 sein soll. Oder ob der aktuelle Code genau das ist, was der Programmierer beabsichtigt hat.