4

我已经为这个问题绞尽脑汁两天了,我尝试了不同的方法,但都没有奏效。我正在构建一个应用程序,它是一种测验。包含问题的三个主题。我想使用 3 个滑块来定义他们想要在每个主题上的问题百分比。

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

如果我选择拥有更多历史记录,我将历史滑块向上滑动,其他滑块应根据它们必须达到 3 个滑块的 100% 的值而减小...

对算法有什么想法吗?当一个滑块达到零值时会发生什么?

数学从来不是我的场景。

任何帮助将不胜感激。

提前致谢。

麦克风

4

3 回答 3

6

虽然 Snowangelic 的回答很好,但我认为将未更改值之间的比率约束如下更有意义。

令 s1, s2, s3 为滑块的当前值,因此 s1+s2+s3=100。您想求解 n1、n2、n3 滑块的新值,因此 n1+n2+n3=100。假设用户将 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

从 33.333...% 开始所有三个滑块

当用户将滑块向上移动 10% 时:将另外两个滑块向下移动 5%。但是如果两个滑块之一达到 0 => 只移动百分之十的另一个。所以它给出了这样的东西:

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];

将三个滑块设置为相同的选择器:

[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 回答