我想在我的应用程序中使用滚动条或轨迹栏控件,允许我的用户在图表中缩放y轴值。
例如,图表可能是峰值为1.0的正弦波。通过拖动滚动条,用户应该能够将峰值增加到2.0,200,或者将其减小到0.5等等。
所以,我想使用滚动条位置创建一个乘法因子,我应用于曲线上的每个y点。
我在这里无法弄清楚数学。我担心控件的操作对用户来说不是平滑或直观的。这里有指数或日志的东西,不存在吗?滚动条的中间部分不会被标记为1.0,其值高于步进(以日志间距为单位),低于1.0,是否会逐步降低?
我记得大约四十年前我的日志/指数数学经验中的零点。
我的语言是Delphi,但伪代码中的一些代码片段会有所帮助。
TIA
PS请随意为此问题添加其他标签,以帮助最适合的观众看到它......
答案 0 :(得分:5)
我认为你已经回答了大部分问题。您知道要使用对数比例。所以你会得到等距的刻度线,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;
当然,如果我选择的数字和最小值/最大值不合适,你可以很容易地重新调整它们。