2009-09-10 174 views
2

我想为我的G15小程序绘制一个垂直滚动条,但难以正确定位(如果您没有为G15 LCD屏幕做过任何操作,请将其视为在160x43像素上绘图图片)。计算滚动条位置

这是我的当前的定位代码:

perc = (float)Math.Round(range/Items.Count+1); 

y = (perc * SelectedID+1); 

滚动条的上边缘是在5像素的从顶部,底部边缘是在32PX。在这种情况下,Y将是滚动条的上端,我使用2像素的长度;我确实尝试了一个可变长度的栏,它和上面的代码一样。 SelectionID为0。

所有我需要的是算出位置的数学,不需要绘制代码。

谢谢。

回答

5

所以你只是简单的线性插值之后,对吧?

如你具有范围a..b一个值c和需要在范围x..y一个结果值基于ab之间其直线位置?

这种情况(假设的问题是浮点或双精度的数字)的公式:

// c is between a and b 
pos = (c-a)/(b-a) // pos is between 0 and 1 
result = pos * (y-x) + x // result is between x and y 

现在,如果一切0指数的,你可以省略ax得到

pos = c/b 
result = pos * y 

如果您使用的任何数字都是整数类型,则需要在分区之前将它们转换为双精度或浮点数(或任何实数类型)。

您可将所有方程式在一起,如果你不能投什么双打,虽然:

result = (c * y)/b 

这将保证cy的整数除法之前相乘发生,这将减少与整数除法相关的误差。

+0

谢谢,这让我接近我需要的地方。我实际上需要(c * y)/(b - 1),它的行为方式与滚动条相同。 – Measter 2009-09-10 17:40:30

+0

一个非常优雅的公式 - 作为开发人员(不是数学专家),这是黑魔法,就像“磁铁,它们是如何工作的?”。 – cloakedninjas 2013-07-03 16:11:34