С подрывной деятельностью можно определить который различный двоичный файл использовать, и параметры для передачи ему. См. руководство по 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
Никакое различие в этих двух файлах после исправления.
Вы пробовали CORDIC алгоритм? Это общая структура для решения полярных ↔ прямоугольных задач с использованием только таблицы сложения / вычитания / битового сдвига +, по сути, с вращением на углы вида tan -1 (2 -n ). Вы можете найти компромисс между точностью и временем выполнения, изменив количество итераций.
В вашем случае возьмите один вектор в качестве фиксированной ссылки и скопируйте другой во временный вектор, который вы поворачиваете с использованием угловых углов по направлению к первому вектору. (примерно пополам), пока вы не достигнете желаемой угловой точности.
( редактировать: используйте знак скалярного произведения, чтобы на каждом шаге определять, следует ли вращать вперед или назад.
Еще во времена нескольких килобайт оперативной памяти и машин с ограниченными математическими возможностями я использовал таблицы поиска и линейную интерполяцию. Основная идея проста: создайте массив с любым разрешением, которое вам нужно (большее количество элементов уменьшает ошибку, создаваемую интерполяцией). Затем выполните интерполяцию между значениями поиска.
Вот пример в обработке ( исходная неработающая ссылка ).
Вы также можете сделать это с помощью других триггерных функций. На процессоре 6502 это позволило вычислить полную трехмерную каркасную графику с увеличением скорости на порядок.
Решение было бы тривиальным, если бы векторы были определены / сохранены с использованием полярных координат вместо декартовых координат (или «а также» с использованием декартовых координат) .
скалярное произведение двух векторов (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)
, конечно, это может быть так же сложно в вычислительном отношении, как вычисление косинуса
, если вам нужно вычислить квадратный корень, рассмотрите возможность использования invsqrt hack .
acos((x1*x2 + y1*y2) * invsqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)));