0

合計で常に 100 になる値が 3 つある

ユーザーは一度に 1 つの値しか変更できません (インクリメントによって、スライダーは一度に 1 つのインクリメントではない可能性があります)。

1 つの値が変更されたら、定数の合計を反映するように他の値も変更する必要がありますが、比例的に

他の 2 つの値のうち大きい方の値は、小さい方の値よりも大きくする必要があります。

ただし、小さい値よりも小さくする必要があります

4

2 に答える 2

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

bc(30:2024:16は両方とも)の間で比率が同じままであることがわかります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 に答える