簡體   English   中英

將雙(或浮點數)轉換為整數時會發生什么?

[英]What happens when converting double (or floats) to ints?

我正在練習一些簡單的2D游戲編程,並提出了一種理論,即在動畫期間(圖像位置的實際變化最好用浮點數計算)。 我有一種感覺,如果用圖像移動圖像,動畫將不會那么平滑。

在Java中,似乎無法使用浮點數繪制圖像以為圖像提供位置。 但顯然當你最初聲明你的xy時 ,你可以將它們聲明為Double或Float,當涉及到實際繪制圖像時,你必須將它們轉換為int。 就像我在這里找到的:

    /**
 * Draw this entity to the graphics context provided
 * 
 * @param g The graphics context on which to draw
 */
public void draw(Graphics g) {
    sprite.draw(g,(int) x,(int) y);
}

我的問題是Java如何處理轉換? 如果代碼在最后一刻投出這些雙打,為什么首先將它們作為雙打? Java會隱藏小數點后的數字嗎?

我知道在C和C ++中,小數點后的數字會被截斷,你只看到它之前的數字。 Java如何處理這個轉換?

Java截斷小數。 例如:

(int) 2.34 == 2
(int) 2.90 == 2

無法在浮動位置繪制的原因很簡單,就是沒有半像素等:)

顯示器上的像素是離散的並且數量有限; 因此顯示坐標需要是整數 - 浮點數沒有意義,因為你在物理上沒有像素(341.4, 234,7)

也就是說,整數只應在最終繪圖階段使用。 計算對象移動,速度等時,需要使用浮點數。 整數將導致數量驚人的精度問題。 請考慮以下代碼段:

a = 1;
x = (a / 2) * 2;

如果ax是浮點數, x最終將具有預期的1 如果它們是整數,你將得到0

基線:使用浮點類型進行物理計算,並在繪圖時轉換為int 這將允許您以所需的精度執行物理計算。

編輯:

就FP值到整數的轉換而言,雖然FP數字具有更大的范圍,但是在規范化到繪圖區域大小之后由物理計算產生的值通常不應溢出int類型。

也就是說,Java在轉換為整數類型時會截斷浮點數,這會產生偽像(例如,最右邊像素列沒有像素的動畫,因為例如639.9被轉換為639而不是640 )。 您可能希望查看Math.round()或Java提供的一些其他舍入方法,以獲得更合理的結果。

Java通過刪除小數將浮動轉換為int。 但我不認為在浮點數中使用x和y坐標是有意義的。 屏幕上有像素,不能以小於一個像素的形式顯示。 例如,您無法繪制像素.5px x .5px因為在屏幕上它只是1px x 1px像素。 我不是電腦游戲程序員,但我用Java編寫了一個動畫引擎,它非常流暢。 如果你願意,我可以分享這個。

請注意,您應該使用整數繪制,但使用雙精度進行所有計算。 對於旋轉或任何依賴於數學公式的東西應該用十進制來完成。

x和y需要加倍的原因是因為它們需要以數學方式計算,例如:

x += (delta * dx) / 1000;

在繪制像素之前,您希望避免溢出和精度損失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM