2013-05-09 1 views
2

내가 뭘 하려는지, 키네틱 모델을 사용하여 멋진 스크롤 막대를 만드는 것입니다. 문제는 오버 슛으로 약화되고 있습니다. 내가 보여주고 싶은 행동은 당신이 오버 슛 (최대/최소를 지나쳐) 할 때, 포지셔닝을 약화시키는 것입니다.스크롤링 오버 슛 오버 슈트 - 수학 문제

내가 원하는 특정 동작은 다음과 같습니다. 즉, Maximumum Overshoot는 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. 

저는 이것을 재귀 적으로 계산할 수 있다고 확신합니다.하지만 그렇게하고 싶지는 않습니다. 나는 수학적 관계가 상당히 명백하다고 생각하지만, 어떻게해야하는지 정확하게 모르겠습니다. 나는 이것이 잘못된 방식으로 생각할 수도 있으므로 내 차트를 무시하십시오.중요 건데 사용자는 최대 오버 슛 값 (이 경우 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

편집 : 제목,이 대답은 그래서 속도와 완충 및 대한 모든 동적 측면을 무시

답변

2

태그입니다. 나는 임의로 큰 오버 슈트 값을 제한된 최대 값을 갖는 변위 값으로 변환하는 것에 집중할 것입니다.

간단한 공식

다음과 같은 것을 요구하고 같은 특성을 가진

한 간단한 공식 : x ≥ 0는 오버 슈트하고 0 ≤ y ≤ 50이 결과 변위 될 수 있습니다. 그럼 당신은 이런 식 사용하여 관련 수 있습니다

y = 50*x/(x + 75) 

분율 x/(x+75) 이제까지 그것을 도달하지 않고 임의 가까운 큰 x 1에 올 것이다, 그래서 당신의 변위 (50) 당신은에 그 75을 조정할 수 초과하지 않을 것 수식이 수렴 속도를 제어합니다. 75 당신은 얻을 것이다 :

곡선의 모양을 통해 더 많은 제어 할

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

더 많은 유연성, 당신은 분자와 분모 모두 x에서 plynomials를 포함하는 다른 공식을 사용할 수 있습니다. 그러나 특정 포인트를 통과하는 커브에 대해 매우 엄격한 요구 사항이 있거나 위의 간단한 접근 방식으로 충분하지 않은 다른 이유가있는 경우에만이 작업을 수행합니다.

의 속도가 가장 가능성이 비 오버 슈트 된 문서의 일치하지 않습니다 때문에 간단한 수식 가능성의 방법으로 콘텐츠 이동을 바보의 원인이됩니다

매칭 속도.속도를 맞추기 위해 1 자유도를 사용하여 경사를 제어 할 수 있습니다. 이를 수행하는 가장 쉬운 방법은 입출력을 위해 동일한 유닛을 사용하는 것입니다. 픽셀. 그런 다음 원점에서 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