2012-11-12 41 views
3

我有一個for循環,裏面的整數x將從533增加到813.這意味着280增量。在同一個循環中,我想在發生上述情況時將y的值從300減少到200。這意味着當x是533時y必須是300而x是813時y必須是200.我知道這可以通過在每次迭代中將y的值減小100/280來實現。但都是整數。數學問題(增加和減少一個循環內的兩個變量)

下面是一些代碼示例我使用,但它不工作:

for(int i = 0; i < b.getSize(); i++) { 
      x = b.getCar(i).getPosX(); 
      b.getCar(i).setPosX(++x); 
      if(x >= ((getWidth()/2) - 140) && x < ((getWidth()/2) + 140)){ 
       y = b.getCar(i).getPosY(); 
       y = (double)(y - (10.0f/28.0f)); 
       b.getCar(i).setPosY((int)y);      
      } 
     } 

我怎麼可能做到這一點。謝謝!

+1

你想畫一條線嗎? –

+0

http://en.wikipedia.org/wiki/Line_drawing_algorithm –

+0

@JanDvorak其實這是一個動畫,我想從西南向東北移動一些盒子。 –

回答

4

有兩種解決方案,簡單和複雜。簡單的:

y = yoff + (int)((double) height * x/width) 

其中yoff = 300, height = -100, width = 813-533。基本上,你做一個浮點運算,然後你圍繞結果。

或者,使用Bresenham line algorithm可以使用純整數數學完成相同的操作,但這需要更多的代碼。

+0

謝謝!這是一個簡單而簡單的方法。 –

3

y必須是doublefloat,並且您需要在使用它時舍入其值。


如果你想做動畫,只需看看插值器。您可以抽象出在極值之間計算值的邏輯。

基本上在開始時,你給你的插補器的開始和結束值。

然後,您給插值器一段時間,它會爲您返回該時間值的開始和結束之間的值。

紅利:它會允許你改變你的動畫外觀&感覺沒有觸及代碼的其餘部分。 (你試圖做的是實際上是一個線性插值,但是使用正弦函數或者其他一些算法,例如彈跳,二次等......)會看起來好得多。)

+0

這只是一種方法,儘管是最簡單的方法。 +1 –

+0

如果是關於畫線的話,Sure Bresenham將是一個不錯的選擇。 –

+0

假設他有一個使用整數的理由,另一種方法是在計算過程中使用y的「幕後」浮點版本。 – Gaminic

2

它看起來像邏輯畫一條線。 Bresenham的算法應該是最好的選擇。

1

保留一個幫助變量double dy,該值跟蹤y的精確值的值。在每次迭代中,使用公式更新dy,然後通過獲取dy的舍入/截斷值來更新y。

1

不確定你喜歡做什麼,但是你目前的解決方案是從浮點到舍入的舍入。爲了避免這種情況,使用浮動/雙打計算並在設置位置時將它們轉換爲整數。