我有三個值應在總的來100在任何時候都平衡3個按比例值
用戶只能更改一次一個值(按增量認爲滑塊可能不是單一的增量在時間)
當一個值變化我想其他人也改變以反映不斷總量,但在按比例
其他兩個值中較大的應增加量比較小值
更多但應該減少小於較小值
我有三個值應在總的來100在任何時候都平衡3個按比例值
用戶只能更改一次一個值(按增量認爲滑塊可能不是單一的增量在時間)
當一個值變化我想其他人也改變以反映不斷總量,但在按比例
其他兩個值中較大的應增加量比較小值
更多但應該減少小於較小值
不確定您的意思是「但應該減小小於更小的值」 - 這似乎表明它是而不是按比例,特別是如果比率只保持在一個方向。
假設這是一個錯誤的方式按比例的無移動值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
)之間的比率保持不變,直到值變得足夠小以使舍入誤差發揮作用(減小它們,然後增加它們可能不會使您返回確切的值開始)。
如果這很重要,您可以考慮使用浮點值作爲最後一步將它們轉換爲整數。
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;
恭喜!像一種享受 –