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