Что такое скалярное произведение векторов и для чего оно используется?
Что проверяют
Базовую математику, которая в коде встречается чаще, чем кажется: освещение и отсечение в графике, сравнение векторов признаков в поиске, работа силы в физике. Заодно смотрят, переводите ли вы формулу в аккуратный код с учётом чисел с плавающей точкой.
Как отвечать
Дайте оба определения. Покоординатное: сумма произведений соответствующих компонент, результат это число. Геометрическое: произведение длин на косинус угла между векторами. Из второго следует всё полезное: знак говорит про угол (положительный это острый, ноль это перпендикулярность, отрицательный это тупой), а делением на длины получают сам косинус.
using System.Numerics;
var a = new Vector3(1, 2, 3);
var b = new Vector3(4, 5, 6);
float dot = Vector3.Dot(a, b);
float cos = dot / (a.Length() * b.Length());
cos = Math.Clamp(cos, -1f, 1f);
float angle = MathF.Acos(cos);Обязательно противопоставьте векторному произведению: оно даёт вектор, перпендикулярный обоим, и отвечает на другой вопрос.
Где применяют: проекция одного вектора на другой, освещение по Ламберту (косинус угла между нормалью и направлением на источник), отсечение задних граней, косинусная близость при сравнении эмбеддингов, вычисление работы силы. Уместно заметить, что операция ложится на векторные инструкции процессора, и на больших массивах это заметно.
Где спотыкаются
Путают скалярное произведение с векторным. Смысл и тип результата разные, а вызовы лежат рядом в одном типе, поэтому ошибка попадает в код молча и вылезает уже на картинке.
Считают арккосинус без ограничения диапазона. Из-за погрешности выражение выходит чуть за единицу, функция возвращает NaN, и сцена гаснет на одном кадре из тысячи.
Проверяют перпендикулярность сравнением с нулём на точное равенство. Для чисел с плавающей точкой нужен допуск, а при сравнении похожести обязательна нормировка: без неё длинный вектор всегда выглядит ближе, чем короткий.