2010-12-21 92 views
4

我已經在這個問題上絞盡腦汁兩天了,我嘗試了不同的東西,但都沒有工作。我正在構建一個應用程序,它是一種quizz。有三個主題包含問題。我想用3個滑塊來定義他們在每個主題上想要的問題的百分比。3個相互連接的滑塊

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

如果我選擇有更多的歷史,我滑了歷史遊標,其它的滑塊應根據他們必須爲3個滑塊達到100%的值減少...

任何想法一個算法?當一個滑塊達到零值時會發生什麼?

數學從來都不是我的場景。

任何幫助將非常感激。

在此先感謝。

邁克

+0

嘿Miky麥克,請點擊正確答案左上角的複選標記,將其設置爲正確答案。我很高興我發佈的代碼爲您工作! – vfn 2010-12-23 13:28:57

回答

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

如果有什麼不對的代碼,請讓我知道,我可以修復它!

+0

非常感謝!你的代碼正是我一直在努力做的。我要花上一百年才能孵化出像這樣的東西。感謝讓他人成長... – 2010-12-22 02:24:05

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 

另一種可能是考慮到總和操作系統可用的ressources爲100,ressources被分爲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 --; 
    } 
    } 
} 

這是假設的修改是肯定的(在修改後的新桶數比以前要高)。這個小算法可以與任何數量的桶(在你的情況下的滑塊)一起工作。

+0

你們是殺手!順便說一句,我是一個新手,我一直在想這個解決方案的百分比總和應該是100%。但是,只要其中一個滑塊達到零值,我就會被卡住。我將盡力將所有這些都實現到代碼中,但不要指望我在幾天之前給你一個答案,因爲我在3周前纔開始學習客觀的C語言。但無論如何,感謝您花一些時間在此。你們好棒 ! – 2010-12-22 00:41:17

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)

+0

你們是殺手!順便說一句,我是一個新手,我一直在想這個解決方案的百分比總和應該是100%。但是,只要其中一個滑塊達到零值,我就會被卡住。 – 2010-12-22 00:32:00