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

Delphi 如何使用滚动条平滑缩放图形或图像,delphi,graphics,scaling,Delphi,Graphics,Scaling,我想在我的应用程序中使用滚动条或轨迹条控件,允许用户缩放图形中的y轴值 例如,图形可能是峰值为1.0的正弦波。通过拖动滚动条,用户应该能够将峰值增加到2.0、200,或者将其减少到0.5,等等 所以,我想使用滚动条的位置来创建一个乘法因子,应用于曲线上的每个y点 我不太懂这里的数学。我担心的是,控制的操作将不会顺利或直观的用户。这里有些涉及指数或对数的东西,不是吗?滚动条的中间是否会被标记为1.0,其值高于向上步进(以对数间隔),低于1.0,则为向下步进 大约四十年前,我的对数/指数数学经验告诉

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

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

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

我不太懂这里的数学。我担心的是,控制的操作将不会顺利或直观的用户。这里有些涉及指数或对数的东西,不是吗?滚动条的中间是否会被标记为1.0,其值高于向上步进(以对数间隔),低于1.0,则为向下步进

大约四十年前,我的对数/指数数学经验告诉我零

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

短暂性脑缺血发作


PS请随意为这个问题添加额外的标签,以帮助最合适的观众看到它。

我想你已经回答了大部分问题。您知道您想要使用对数刻度。所以你会得到等距的记号,比如说0.01,0.1,1.0,10.0,100.0

您应该使用轨迹栏,而不是滚动条。轨迹栏上的值为对数刻度。所以你想让类似0的东西对应0.01,100对应0.1200对应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;

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

您不使用图表控件本身进行缩放有什么好的原因吗?而且,你的问题几乎无法回答/含糊不清/模糊/未定义。但是,出于纯粹的“语义”原因,我会在
位置:Integer
参数之前使用
常量。(是的,这是我能想到的最严厉的反对意见!)安德烈亚斯我也这么想,但我懒得在这里打出来。我很高兴你能帮我编辑它!!;-)+1.你的数学看起来不错。顺便说一句,这是我们的朋友。昨晚我否决了一篇帖子,今天我的代表被否决了6篇(没有任何关于dv的解释),他被否决了4篇。我想知道谁是另一张否决票的接受者;我想我们现在知道了。你认为他会长大,不再那么孩子气吗?+1,试着平衡一下反对票。我最近看到过随机的落选,包括我。有人知道谁/为什么吗?我不知道怎样才能知道谁对一个问题或答案投了什么票。