如何使用滚动条平滑地缩放图形或图像

时间:2011-10-13 17:56:36

标签: delphi graphics scaling

我想在我的应用程序中使用滚动条或轨迹栏控件,允许我的用户在图表中缩放y轴值。

例如,图表可能是峰值为1.0的正弦波。通过拖动滚动条,用户应该能够将峰值增加到2.0,200,或者将其减小到0.5等等。

所以,我想使用滚动条位置创建一个乘法因子,我应用于曲线上的每个y点。

我在这里无法弄清楚数学。我担心控件的操作对用户来说不是平滑或直观的。这里有指数或日志的东西,不存在吗?滚动条的中间部分不会被标记为1.0,其值高于步进(以日志间距为单位),低于1.0,是否会逐步降低?

我记得大约四十年前我的日志/指数数学经验中的零点。

我的语言是Delphi,但伪代码中的一些代码片段会有所帮助。

TIA

PS请随意为此问题添加其他标签,以帮助最适合的观众看到它......

1 个答案:

答案 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;

当然,如果我选择的数字和最小值/最大值不合适,你可以很容易地重新调整它们。