所以我想做的是使用动力学模型制作一个漂亮的滚动条。这个问题正在抑制超调。我想展示的行为是,当您超调(超过最大值/最小值)时,它会抑制定位。
我想要的具体行为是这样的:也就是说,最大超调是 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
编辑:标题、标签
最佳答案
这个答案忽略了有关速度和阻尼等的所有动态方面。我将集中精力将可能任意大的超调值转换为具有最大值有界的位移值。
一个简单的公式
具有您所要求的属性的一个简单公式如下:令x ≥ 0
为超调,0 ≤ y ≤ 50
为结果位移。然后您可以使用如下公式将它们关联起来:
y = 50*x/(x + 75)
对于大的x
,分数x/(x+75)
将任意接近1,而不会达到它,所以你的位移永远不会超过50。你可以调整公式中的 75
来控制收敛速度。对于 75,您将获得:
x y
25 12.5
50 20.0
100 28.6
200 36.4
400 42.1
更加灵活
为了更好地控制曲线的形状,您可以使用不同的公式,其中分子和分母都包含 x
中的多项式。但只有当您对通过特定点的曲线有非常严格的要求,或者由于其他原因导致上述简单方法不够时,我才会这样做。
匹配速度
简单的公式可能会导致内容移动方式出现抖动,因为其速度很可能与非溢出文档的速度不匹配。为了匹配速度,您可以使用一个自由度来控制坡度。最简单的方法是使用相同的输入和输出单位,例如像素。然后您的目标是原点处的斜率为 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
数据点。
关于math - 滚动位移超调 - 数学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16471571/