Какой алгоритм я должен использовать, чтобы плавно масштабировать график или карту? - PullRequest
2 голосов
/ 27 октября 2010

У меня есть график, сгенерированный функцией, и он автоматически масштабируется в зависимости от значения функции.У меня уже есть инструменты для построения графиков, и я могу отображать любые x, y, ширину, высоту в высоком разрешении.

Я пробовал просто привязать к нужному месту:

x = target_x
y = target_y
width = target_width
height = target_height

Но это слишком нервно,Трудно сказать, какая часть была увеличена или уменьшена.

Я также пытался сделать это:

orig_x = x //ditto for y, width, height, etc
for i=1 to 10
    x = i/10*new_x + i/10*orig_x
    wait 25ms

Это более плавно, но первый шаг все еще слишком нервный.Если orig_x равен 10, а new_x равен 1 миллиону, то первый скачок слишком велик, около 1 000 000%.Однако последний прыжок составляет всего 10%.Геометрическая прогрессия еще лучше, но если мне нужно поменять направление при среднем увеличении, шаги будут нестабильными.

Какой наилучший эффект использовать?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Вы хотите увеличивать / сдвигать фиксированный процент последнего окна для каждого шага.Это означает, что ваш зум будет экспоненциальной кривой, а ваш сдвиг будет привязан к вашему зуму.Что-то вроде следующего должно быть улучшением:

width_ratio = new_width / old_width
width_ratio_log = log(width_ratio)

x_diff = new_x - old_x
x_factor = x_diff / (width_ratio - 1)
-- warning: need to handle width_ratio near 1 the old way!

for i=1 to steps
    width_factor = exp(width_ratio_log * i / steps)
    width = old_width * width_factor
    x = old_x + x_factor * (width_factor - 1)

    -- similarly for y and height...
0 голосов
/ 27 октября 2010

Я могу попробовать

xDiff = new_x - orig_x
stepCount = 10

for i=1 to stepCount
    x = orig_x + i/stepCount * xDiff
    wait 25ms
...