0

我有三个值,在任何时候总应该达到 100

用户一次只能更改一个值(通过增量认为滑块可能不是一次单个增量)

当一个值发生变化时,我希望其他值也发生变化以反映恒定的总数,但是按比例计算

其他两个值中较大的值应该比较小的值增加得更多

但应该减少小于较小的值

4

2 回答 2

2

不确定您所说的“但应该减少小于较小的值”是什么意思 - 这似乎表明它不是按比例计算的,特别是如果比率仅保持在一个方向上。

假设这是一个错误,按比例分配非移动值bc方法只是在移动值a发生变化时保持它们的比率,例如:

a = 50, b = 30, c = 20             # initial values
aDelta = 10                        # how much to change 'a' by

bDelta = -aDelta * b / (b + c)     # bDelta <- -6
cDelta = -aDelta - bDelta          # cDelta <- -4

a = a + aDelta                     # a <- 60
b = b + bDelta                     # b <- 24
c = c + cDelta                     # c <- 16

您可以在那里看到band c( 30:20and 24:16are both 3:2) 之间的比率保持不变,至少直到值变得足够小以使舍入误差发挥作用(减少它们,然后增加它们可能不会给您返回您开始的确切值和)。

如果这很重要,您可以考虑对值使用浮点数,然后将它们简单地转换为整数作为最后一步。

于 2012-09-25T08:55:36.943 回答
0

因为 B 和 C 也需要计算张贴在帕斯卡(手头的第一个 IDE)中以显示完整的解决方案

if inhibit then exit; { stop position changes in callback calling this! }

inhibit:=true;

if (sender=TrackBar1) then begin
  aDelta:= trunc(TrackBar1.Position)-a;
  bDelta:= -aDelta * b / (b + c);
  cDelta:= -aDelta - bDelta;
end;

if (sender=TrackBar2) then begin
  bDelta:= trunc(TrackBar2.Position)-b;
  aDelta:= -bDelta * a / (a + c);
  cDelta:= -bDelta - aDelta;
end;

if (sender=TrackBar3) then begin
  cDelta:= trunc(TrackBar3.Position)-c;
  bDelta:= -cDelta * b / (b + a);
  aDelta:= -cDelta - bDelta;
end;


a:= a+aDelta;
b:= b+bDelta;
c:= c+cDelta;

TrackBar1.Position:=trunc(a);
TrackBar2.Position:=trunc(b);
TrackBar3.Position:=trunc(c);
label1.Caption:=FormatFloat('###.##',a);
label2.Caption:=FormatFloat('###.##',b);
label3.Caption:=FormatFloat('###.##',c);
label4.Caption:=FormatFloat('###.##',a+b+c);

inhibit:=false;           
于 2012-09-25T10:16:44.783 回答