Как использовать полосу прокрутки для плавного масштабирования графика или изображения - PullRequest
2 голосов
/ 13 октября 2011

Я хочу использовать полосу прокрутки или панель управления в своем приложении, которая позволяет моим пользователям масштабировать значения оси Y на графике.

Например, возможно, график представляет собой синусоидальную волну с пиком 1,0. Перетаскивая полосу прокрутки, пользователь сможет увеличить пиковое значение до 2,0, 200 или уменьшить его до 0,5 и т. Д.

Итак, я хочу использовать положение полосы прокрутки для создания коэффициента умножения, который я применяю к каждой точке y на моей кривой.

Я не могу понять математику здесь. Я обеспокоен тем, что управление не будет гладким или интуитивно понятным для пользователя. Здесь есть что-то, связанное с экспонентами или журналами, не так ли? Разве середина полосы прокрутки не будет помечена как 1,0 со значениями выше шага (в интервале журнала) вверх и ниже 1,0, шага вниз?

Я помню ноль из моего логарифмического / экспоненциального математического опыта почти четыре десятилетия назад.

Мой язык - Delphi, но некоторые фрагменты кода в псевдокоде были бы полезны.

ТИА

PS Пожалуйста, не стесняйтесь добавлять дополнительные теги к этому вопросу, чтобы помочь его увидеть наиболее подходящей аудитории ...

1 Ответ

5 голосов
/ 13 октября 2011

Я думаю, что вы уже ответили на большинство вопросов. Вы знаете, что хотите использовать масштаб журнала. Таким образом, вы должны иметь одинаковые интервалы между отметками 0,01, 0,1, 1,0, 10,0, 100,0, скажем.

Вместо полосы прокрутки вы должны использовать трекбар. Значения на панели треков находятся в лог-масштабе Таким образом, вы хотите, чтобы что-то вроде 0 соответствовало 0,01, 100 соответствовало 0,1, 200 соответствовало 1,0 и так далее. Это дает вам трекбар с минимумом 0, максимумом 400 и начальной позицией 200, то есть 1,0.

Теперь осталось сопоставить положение трек-бара с масштабом. Вам нужно Scale(0), чтобы равняться 0,01, Scale(100), чтобы равняться 0,1 и так далее. Вы делаете это, используя возведение в степень до степени 10.

function Scale(const Position: Integer): Double;
var
  Exponent: Double;
begin
  Exponent := (Position-200)/100.0;
  Result := Power(10.0, Exponent);
end;

Чтобы пойти другим путем, нужно взять логарифмы и переставить.

function Position(const Scale: Double): Integer;
begin
  Result := Round(100.0*Log10(Scale)) + 200;
end;

Естественно, если выбранные цифры и минимальные / максимальные значения не подходят, вы можете легко перенастроить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...