Бывают ситуации, когда существует несколько методов для вычисления одного и того же значения.
Прямо сейчас я придумываю алгоритм "расширения" двумерного выпуклого многоугольника. Для этого я хочу найти направление возмущения каждой вершины. Чтобы получить результат, который расширяет многоугольник «оболочкой» одинаковой толщины по всему периметру, величина возмущения в этом направлении также зависит от угла при вершине. Но сейчас меня просто беспокоит направление.
Один из способов - использовать atan2: пусть B - моя вершина, A - предыдущая вершина, а C - следующая вершина. Мое направление - это «среднее угловое значение» угла (B-A)
и угла (B-C)
.
Другой способ - sqrt: единица (BA) + единица (BC)
, где единица (X)
равно X / длина (X)
дает вектор с моей стороны.
Я склоняюсь к методу № 2, потому что усреднение значений углов требует некоторой работы. Но я в основном выбираю между двумя вызовами atan2 и двумя вызовами sqrt. Что вообще быстрее? Что, если бы я делал это в шейдерной программе?
Я не пытаюсь оптимизировать свою программу как таковую, я хотел бы знать, как эти функции обычно реализованы (например, в стандартных библиотеках c), чтобы я мог знать, в общем, что такое лучший выбор.
Насколько мне известно, и функциям sqrt, и триггерам требуется итерационный метод для получения ответа. Это причина, по которой мы стараемся избегать их, когда это возможно. Люди придумали «приблизительные» функции, которые используют таблицы поиска, интерполяцию и тому подобное, чтобы попытаться получить более быстрые результаты. Я, конечно, никогда не буду беспокоиться об этом, если я не найду убедительных доказательств наличия узких мест в моем коде только из-за этих подпрограмм или подпрограмм, которые сильно их задействуют, но различия между функциями sqrt, триггерами и обратными триггерами могут иметь значение для обсуждения. .