Как уже упоминалось несколько раз, вы не можете нормализовать нулевой вектор. Итак, ваши варианты:
Вариант 4 не очень хорош, потому что некоторые языки (такие как C) не имеют исключений, и нормализация вектора обычно находится в очень низком код уровня. Создание исключения довольно дорого, и любой код, который может захотеть обработать случай с нулевым / малым вектором, получит ненужный удар по производительности, когда это произойдет.
У варианта 1 есть проблема, заключающаяся в том, что возвращаемое значение не будет иметь единичную длину, и поэтому оно может молча вносить ошибки в код вызова, который предполагает, что результирующий вектор имеет единичную длину.
Вариант 2 имеет проблему, аналогичную варианту 1, но, поскольку NaN обычно намного более заметны, чем нули, он, вероятно, будет проявляться легче.
Я думаю, что вариант 3 является лучшим решением, хотя он и делает интерфейс более сложным. Вместо того чтобы сказать
vec3 = myVec.normalize();
Теперь вы должны сказать что-то вроде
vec3 result;
bool success = myVec.normalize(&result);
if(success)
// vector was normalized
else
// vector was zero (or small)
Why not use roles to achieve this:
House A has a Bedroom
Bedroom does SleepingArea
House has a Studyroom
Studyroom does ComfyArea
House B has a MasterRoom
MasterRoom does SleepingArea and ComfyArea