我有三个值,总共应该达到100
用户一次只能更改一个值(通过增量思考滑块,它一次可能不是单个增量)
当一个值发生变化时,我希望其他值也改变以反映常数总和,但是按比例变化
其他两个值中较大的值应该比较小的值
增加更多但应减少小于较小的值
答案 0 :(得分:2)
不确定你的意思是“但是应该减少小于较小的值” - 这似乎表明它的不是按比例,特别是如果只保持一个方向的比率。
假设这是一个错误,那么支持非移动值b
和c
的方法就是在移动值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
您可以看到b
和c
之间的比率保持不变(30:20
和24:16
都是3:2
),至少在此之前值变得足够小以使舍入错误发挥作用(减少它们,然后增加它们可能无法返回您开始时的确切值)。
如果这很重要,您可以考虑对值使用浮点数,然后将它们转换为整数作为最后一步。
答案 1 :(得分:0)
因为B和C也需要在pascal(第一个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;