В настоящее время я использую тот же алгоритм, что и на вашей ссылке, и он все еще слишком медленный для устройств Android
Из моей ссылки в комментариях выше :
Given
r = Sqrt((x - 0.5)^2 + (y - 0.5)^2)
a = ArcTan2(y - 0.5, x - 0.5)
n = Bulge factor (default = 1)
Set
x' = r^n * Cos(a) + 0.5
y' = r^n * Sin(a) + 0.5
(Помните, что в этом уравнении x
и y
изменяются от 0 до 1. Если ваши измерения охватывают от 0 до w
, замените 0.5
наw/2
)
Используя немного математики , мы можем видеть, что
Cos(a) = Cos(ArcTan2(y - 0.5, x - 0.5))
= (x - 0.5)/r
Sin(a) = Sin(ArcTan2(y - 0.5, x - 0.5))
= (y - 0.5)/r
Это делает окончательное результирующее уравнение
r = (x - 0.5)^2 + (y - 0.5)^2
n = Bulge factor (default = 0)
Set
x' = r^n * (x - 0.5) + 0.5
y' = r^n * (y - 0.5) + 0.5
(Я удалил квадратный корень, так как мы в любом случае переносим результат в реальную силу ... поэтому, чтобы действительно сделать этот эквивалент, мы должны использовать n/2
вместо n
, но так как мы определяя «коэффициент выпуклости», мы можем просто пропустить дополнительное деление)
Только с несколькими умножениями и одним вещественным возведением в степень, это, вероятно, самый быстрый способ, которым вы можетенадеюсь получить.