Дешевый алгоритм для нахождения меры угла между векторами

С подрывной деятельностью можно определить который различный двоичный файл использовать, и параметры для передачи ему. См. руководство по svn, различному

, Вы хотели бы произвести регулярный файл исправления из svn разности, таким образом, Вы захотите, чтобы svn разность была похожа на нормальную различную Попытку это:

svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
...
patch -p0 < mypatch

Подтверждение концепции:

echo "newline" >> README.txt
svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
cp README.txt README.txt.patched
svn revert README.txt
patch -p0 < mypatch
diff README.txt README.txt.patched

Никакое различие в этих двух файлах после исправления.

29
задан Community 23 May 2017 в 12:01
поделиться

6 ответов

Вы пробовали CORDIC алгоритм? Это общая структура для решения полярных ↔ прямоугольных задач с использованием только таблицы сложения / вычитания / битового сдвига +, по сути, с вращением на углы вида tan -1 (2 -n ). Вы можете найти компромисс между точностью и временем выполнения, изменив количество итераций.

В вашем случае возьмите один вектор в качестве фиксированной ссылки и скопируйте другой во временный вектор, который вы поворачиваете с использованием угловых углов по направлению к первому вектору. (примерно пополам), пока вы не достигнете желаемой угловой точности.

( редактировать: используйте знак скалярного произведения, чтобы на каждом шаге определять, следует ли вращать вперед или назад.

12
ответ дан 28 November 2019 в 01:36
поделиться

Еще во времена нескольких килобайт оперативной памяти и машин с ограниченными математическими возможностями я использовал таблицы поиска и линейную интерполяцию. Основная идея проста: создайте массив с любым разрешением, которое вам нужно (большее количество элементов уменьшает ошибку, создаваемую интерполяцией). Затем выполните интерполяцию между значениями поиска.

Вот пример в обработке ( исходная неработающая ссылка ).

Вы также можете сделать это с помощью других триггерных функций. На процессоре 6502 это позволило вычислить полную трехмерную каркасную графику с увеличением скорости на порядок.

12
ответ дан 28 November 2019 в 01:36
поделиться

Решение было бы тривиальным, если бы векторы были определены / сохранены с использованием полярных координат вместо декартовых координат (или «а также» с использованием декартовых координат) .

2
ответ дан 28 November 2019 в 01:36
поделиться

скалярное произведение двух векторов (x1, y1) и (x2, y2) равно

x1 * x2 + y1 * y2 

и эквивалентно произведению длин двух векторов на косинус угла между их.

Итак, если вы сначала нормализуете два вектора (разделите координаты на длину)

Where length of V1 L1 = sqrt(x1^2 + y1^2),  
  and length of V2 L2 = sqrt(x2^2 + y2^2),

Тогда нормализованные векторы будут

(x1/L1, y1/L1),  and (x2/L2, y2/L2),  

И скалярным произведением нормализованных векторов (что совпадает с косинусом угла между векторами ) было бы

 (x1*x2 + y1*y2)
 -----------------
     (L1*L2)

, конечно, это может быть так же сложно в вычислительном отношении, как вычисление косинуса

1
ответ дан 28 November 2019 в 01:36
поделиться

, если вам нужно вычислить квадратный корень, рассмотрите возможность использования invsqrt hack .

acos((x1*x2 + y1*y2) * invsqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)));
1
ответ дан 28 November 2019 в 01:36
поделиться

Точечный продукт может работать в вашем случае. Он не пропорционален углу, а «связан».

0
ответ дан 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: