2013-05-09 2 views
2

Так что я пытаюсь сделать, это сделать простую полосу прокрутки, используя кинетическую модель. Проблема утомляет при перестрелке. Поведение, которое я хочу показать, заключается в том, что когда вы перешагиваете (пройдите мимо максимума/минимума), он увлажняет позиционирование.Перемещение смещения прокрутки - математический выпуск

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

Displacement  | Position it | Percent 
of position  | Displays @ | Overshot Over 
------------------------------------------------- 
    25   | 12.5  | 50% 
    100   | 25  | 100% 
    200   | 37.5  | 200% 
    400   | 43.75 | 400% 
    ...    ...   ... 

Note: Decimals would obviously round down so we can actually display it. 

Я уверен, что могу вычислить это рекурсивно (но я не хочу этого делать). Я думаю, что математические отношения довольно очевидны, хотя я не совсем уверен, как это сделать. Возможно, я даже думаю об этом неправильно, поэтому, пожалуйста, подумайте о том, чтобы игнорировать мой график.important Дело в том, что пользователь не может переместить окно за пределы максимального значения превышения (в данном случае 50 пикселей).

Вот сегментировать кода выполняется настройка позиционирования ...

function KineticModel:SetPosition(NewPosition) 
    -- Set's the position of the kinetic model. Using this, it'll calculate velocity. 


    local CurrentTime = tick() 
    local ElapsedTime = CurrentTime - self.TimeStamp 
    local LocalVelocity = ((self.Position - self.LastPosition) * 5)/ElapsedTime 

    TimeStamp = CurrentTime 
    self:SetVelocity((0.2 * self.Velocity) + (0.8 * LocalVelocity)) -- 20% previous velocity maintained, 80% of new velocity used. 

    if NewPosition > self.Maximum then 
     print("[KineticModel] - Past Max Manual") 
     local Displacement = math.abs(NewPosition - self.Maximum) 
     -- Dampen position so it can't go over. 

     self.Position = self.Maximum + (Displacement/self.MaxBounce) -- This doesn't work. :(
    elseif NewPosition < self.Minimum 
     print("[KineticModel] - Past Min Manual") 
     local Displacement = math.abs(NewPosition - self.Minimum) 
     -- Same displacement here 
    else 
     self.Position = NewPosition 
    end 

    self.LastPosition = self.Position 
    self.OnPositionChange(self.Position) 
    print("[KineticModel] - Set Velocity @ "..self.Velocity.."; Local Velocity @ "..LocalVelocity) 

end 

Основной вопрос пытается найти математический способ найти смещение я должен отображать его на. Я буду реализовывать это смещение, чтобы в основном отфильтровать позицию до ее установки в каждой точке, поэтому, если есть потенциальная проблема с этим, скажите, пожалуйста.

Спасибо. : D

Edit: Название, Tag

ответ

2

Этот ответ игнорирует все динамические аспекты о скорости и увлажняющего и так далее. Я сосредоточусь на преобразовании значения перерегулирования, которое может быть сколь угодно большим в значение смещения с ограниченным максимальным значением.

Простая формула

Одна простая формула со свойствами, как вы просите будет следующее: пусть x ≥ 0 быть перерегулирование и 0 ≤ y ≤ 50 быть результирующее смещение. Затем вы можете связать их, используя формулу, как это:

y = 50*x/(x + 75) 

Фракция x/(x+75) придет сколь угодно близко к 1 для больших x никогда не достигая его, так что ваше перемещение никогда не будет превышать 50. Вы можете настроить, что 75 в формулу для управления скоростью, с которой она сходится. Для 75 вы получите:

x y 
25 12.5 
50 20.0 
100 28.6 
200 36.4 
400 42.1 

Больше гибкости

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

скорость Matching

Простая формула, скорее всего, вызовет рывок на пути двигается контент, так как его скорость будет, скорее всего, не совпадающей с не-Перекусом документа.Чтобы соответствовать скоростям, вы можете использовать одну степень свободы для управления наклоном. Самый простой способ сделать это - использовать один и тот же блок для ввода и вывода, например. пиксели. Тогда вы будете стремиться к наклону 1 в начале координат.

y = 50*x(x + 50) = x/(x/50 + 1) 

Это даст следующие значения:

x y 
25 16.7 
50 25.0 
100 33.3 
200 40.0 
400 44.4 

Иллюстрация

Вот сюжет из двух функций, которые я упоминал, вместе с точками данных из вашей таблицы. Не точное совпадение, но должно быть достаточно близко. Обратите внимание, что для первой строки вашей таблицы я не был уверен, какой из колумбов выбрать как значение x, так что теперь есть две точки данных для y=12.5.

Plot of function

Смежные вопросы