2016-04-04 7 views
0

Я смотрел исходный код этого raytracer. В файл с именем algebra3.cpp в строке 145 мы можем увидеть эту функцию:Почему этот тип возврата действителен?

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

Он должен возвращать объект vec2 вместо его возвращающего vec3. Почему это?

+6

Исходный код в верхних положениях: «Вектор одного измерения (2d, 3d или 4d) может быть отнесен к вектору более высокого или более низкого измерения. Если лить в более высокий размер, , новый компонент устанавливается по умолчанию равным 1.0, если не указано значение : vec3 a (1.0, 2.0, 3.0); vec4 b (a, 4.0); // now b == {1.0, 2.0, 3.0, 4.0}; При отливке в нижний размер вектор гомогенизируется в нижнем измерении. Например, если 4d (X, Y, Z, W} отбрасывают в 3d, итоговый вектор представляет собой {X/W, Y/W, Z/W}. Пользователь должен до гарантировать, что четвертый компонент не равен нулю перед литьем. ' – EdChum

+0

В нем указано, что векторы могут быть отлиты для разных типов более высоких/меньших размеров. – EdChum

+0

Возможно, это будет ошибка. Похоже, что компилятор конвертирует с vec3 в vec2. –

ответ

1

Если vec3 неявно конвертируется в vec2, то функция верна, насколько компилятор знает.

Казалось бы, глупо выбрасывать av.n[VZ] сразу после его расчета. Если это то, что делает программа, тогда я собираюсь предположить, что это может быть ошибка программиста.

Без дополнительной информации о том, что должна делать функция, невозможно определить, должен ли он действительно возвращать vec3, или дополнительный расчет остался без кода останова, а временный должен быть типа vec2. Или то, что текущий код точно соответствует программисту.

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