2012-09-25 46 views
0

我有三個值應在總的來100在任何時候都平衡3個按比例值

用戶只能更改一次一個值(按增量認爲滑塊可能不是單一的增量在時間)

當一個值變化我想其他人也改變以反映不斷總量,但在按比例

其他兩個值中較大的應增加量比較小值

更多

但應該減少小於較小值

回答

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 

你可以看到有bc30:2024:16均爲3:2)之間的比率保持不變,直到值變得足夠小以使舍入誤差發揮作用(減小它們,然後增加它們可能不會使您返回確切的值開始)。

如果這很重要,您可以考慮使用浮點值作爲最後一步將它們轉換爲整數。

+0

恭喜!像一種享受 –

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;