4

私はこの問題について 2 日間頭を悩ませてきました。さまざまなことを試しましたが、どれもうまくいきません。私は一種のクイズであるアプリを構築しています。質問を含む3つの科目があります。3 つのスライダーを使用して、各主題について必要な質問の割合を定義したいと思います。

ex : slider one   = History
     slider two   = Maths
     slider three = Grammar

履歴を増やすことを選択した場合は、履歴スライダーを上にスライドさせます。他のスライダーは、3 つのスライダーで 100% に達する必要がある値に従って減少するはずです...

アルゴリズムのアイデアはありますか? 1 つのスライダーがゼロの値に達するとどうなりますか?

数学は私のシーンではありませんでした。

どんな助けでも大歓迎です。

前もって感謝します。

マイク

4

3 に答える 3

6

Snowangelic の答えは良いですが、変更されていない値の間の比率を次のように制約する方が理にかなっていると思います。

s1、s2、s3 をスライダーの現在の値とすると、s1+s2+s3=100 となります。n1+n2+n3=100 となるように、n1、n2、n3 についてスライダーの新しい値を解きたいとします。ユーザーが s1 を n1 に変更したとします。次に、次の制約が追加されます。

n2/n3 = s2/s3

したがって、n1+n2+n3=100 の場合、問題の解は次のようになります。

n2 = (100-n1)/(s3/s2 + 1) または 0 (s2=0 の場合) および

n3 = (100-n1)/(s2/s3 + 1) または 0 (s3=0 の場合)

于 2010-12-21T23:56:45.250 に答える
1

3 つのスライダーすべてを 33.333...% で開始します。

ユーザーがスライダーを 10% 上げたら、他の 2 つのスライダーを 5% 下げます。しかし、2 つのスライダーのうちの 1 つが 0 に達した場合 => 10% のうちのもう 1 つだけを動かします。したがって、次のようなものが得られます。

User moved slider of x (my be positive or negative)
 for first slider
   if slider -x/2  > 0 and x/2 < 100
     move this slider of -x/2
   else
     move the other slider of -x/2

 for second slider
   if slider -x/2  > 0 and x/2 < 100
     move this slider of -x/2
   else
     move the other slider of -x/2
end

別の可能性は、利用可能なリソースの合計が 100 であり、リソースが n 個のバケット (この場合は 3) に分割されていることを考慮することです。ユーザーがスライダーを動かすと、対応するバケット内のリソースの数が修正されます。そのため、他のバケットからリソースを取得するか、これらの他のバケットにリソースを配置できます。

あなたは次のようなものを持っています:

state 1 ; modified bucket ; new number of ressources in that bucket

modification = new number of ressources in the bucket - number of rescources in the state 1
for (int i=0 ; modification > 0 ; i++){
  i=i%nbr of buckets;
  if(bucket i != modified bucket){
    if(number of ressources in bucket i-- > 0 && number of ressources in bucket i-- < 100){
      number of ressources in bucket i--;
      modification --;
    }
  }
}

これは、変更が正であると想定しています (変更されたバケットの新しい数値が以前よりも高い)。この小さなアルゴリズムは、任意の数のバケット (この場合はスライダー) で機能します。

于 2010-12-21T23:05:54.893 に答える
0

次のアルゴリズムを見直して、もちろん最適化する必要があります。これは私がまとめたものであり、テストはしていません。

各スライダーを最大値と最小値で初期化し、必要に応じて初期値を設定しますが、それを尊重しx + y + z = 1ます。

[self.slider1 setMinimumValue:0.0];
[self.slider1 setMaximumValue:1.0];
[self.slider1 setValue:0.20];

[self.slider2 setMinimumValue:0.0];
[self.slider2 setMaximumValue:1.0];
[self.slider2 setValue:0.30];

[self.slider3 setMinimumValue:0.0];
[self.slider3 setMaximumValue:1.0];
[self.slider3 setValue:0.50];

3 つのスライダーを同じセレクターに設定します。

[self.slider1 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];
[self.slider2 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];
[self.slider3 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];

セレクターは次のようにする必要があります。

- (void)valueChanged:(UISlider *)slider {
 UISlider *sliderX = nil;
 UISlider *sliderY = nil;
 UISlider *sliderZ = nil;

 if (slider == self.slider1) {
  sliderX = self.slider1;
  sliderY = self.slider2;
  sliderZ = self.slider3;
 } else if (slider == self.slider2) {
  sliderY = self.slider1;
  sliderX = self.slider2;
  sliderZ = self.slider3;
 } else {
  sliderY = self.slider1;
  sliderZ = self.slider2;
  sliderX = self.slider3;
 }

 float x = sliderX.value;
 float y = sliderY.value;
 float z = sliderZ.value;

 // x + y + z = 1 
 // Get the amout x has changed
 float oldX = 1 - y - z;
 float difference = x - oldX;

 float newY = y - difference / 2;
 float newZ = z - difference / 2;

 if (newY < 0) {
  newZ += y + newY;
  newY = 0;
 }

 if (newZ < 0) {
  newY += z + newZ;
  newZ = 0;
 }

 [sliderY setValue:newY animated:YES];
 [sliderZ setValue:newZ animated:YES];
}

このコードに問題がある場合は、お知らせください。修正できます。

于 2010-12-21T23:44:09.790 に答える