--Arc Radius Mode
--
--We need to calculate the center of the circle that has the designated radius and passes
--through both the current position and the target position. This method calculates the following
--set of equations where [x,y] is the vector from current to target position, d == magnitude of
--that vector, h == hypotenuse of the triangle formed by the radius of the circle, the distance to
--the center of the travel vector. A vector perpendicular to the travel vector [-y,x] is scaled to the
--length of h [-y/d*h, x/d*h] and added to the center of the travel vector [x/2,y/2] to form the new point
--[i,j] at [x/2-y/d*h, y/2+x/d*h] which will be the center of our arc.
--d^2 == x^2 + y^2
--h^2 == r^2 - (d/2)^2
--i == x/2 - y/d*h
--j == y/2 + x/d*h
--Expanding the equations:
--d -> sqrt(x^2 + y^2)
--h -> sqrt(4 * r^2 - x^2 - y^2)/2
--i -> (x - (y * sqrt(4 * r^2 - x^2 - y^2)) / sqrt(x^2 + y^2)) / 2
--j -> (y + (x * sqrt(4 * r^2 - x^2 - y^2)) / sqrt(x^2 + y^2)) / 2
--Which can be written:
--i -> (x - (y * sqrt(4 * r^2 - x^2 - y^2))/sqrt(x^2 + y^2))/2
--j -> (y + (x * sqrt(4 * r^2 - x^2 - y^2))/sqrt(x^2 + y^2))/2
--Which we for size and speed reasons optimize to:
--h_x2_div_d = sqrt(4 * r^2 - x^2 - y^2)/sqrt(x^2 + y^2)
--i = (x - (y * h_x2_div_d))/2
--j = (y + (x * h_x2_div_d))/2
------------------------------------------------------------------------------------------------------
Сразу прошу прощения за возможный некоректный английский текст...
вот этот расчет хочу перевести в целочисленное вычисление (последние 3 формулы).
Сейчас задача решена "в лоб". Т.е. операция деление и вычисление квадратного корня реализованы в ПЛИС как целочисленные (например 7/3=2 и остаток 1).
И для достижения точности вычислений производится умножение числителя на 32768 (при вычислении h_x2_div_d). Но это приводит в итоге к увелечению разрядности и уменьшению скорости работы. Например если входные данные 16 бит то уже окончательное вычисление значение числителя (сложение или вычитание) производиться уже с 48 битами. Сейчас погрешность (разница вычислений во флоате и целочисленным) не более 1 еденицы для одной координаты и относительно не высокая скорость...
Например:
Цитата
x = 730
y = 1412
rad = 894
float:
i = -48.878333
j = 1013.822425
int:
i = -48
j = 1013
y = 1412
rad = 894
float:
i = -48.878333
j = 1013.822425
int:
i = -48
j = 1013
Подробности расчета во вложении - там вычисления в целочисленном виде и float ...
Интересуют идеи как посчитать быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными...
PS. Реализовать в ПЛИС FPU не предлагать...