Что происходит при конвертации двойных (или плавающих) в целые числа? - PullRequest
6 голосов
/ 02 ноября 2011

Я практикую простое программирование 2D-игр и выдвинул теорию, согласно которой во время анимации (фактическое изменение положения изображения лучше всего рассчитывать с помощью чисел с плавающей запятой).У меня такое ощущение, что если вы перемещаете изображение с помощью вставок, анимация не будет такой плавной.

В Java кажется, что вы не можете нарисовать изображение с числами с плавающей запятой, чтобы придать изображению позицию.Но, очевидно, когда вы первоначально объявляете свои x и y , вы можете объявить их как Double или Float, и когда дело доходит до фактического рисования изображения, вы должны привести их кИнтс.Как я нахожу ЗДЕСЬ :

    /**
 * 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 обрабатывает преобразование?Если код приводит эти удвоения в последнюю минуту, то почему они в первую очередь удваиваются?Ява скрывает числа после десятичного числа?

Я знаю, что в C и C ++ числа после десятичного числа обрезаются, и вы видите только то, что перед ним.Как Java обрабатывает это приведение?

Ответы [ 4 ]

4 голосов
/ 02 ноября 2011

Пиксели на дисплее дискретны и ограничены в количестве; следовательно, координаты отображения должны быть целыми числами - числа с плавающей точкой не имеют смысла, так как физически у вас нет пикселя, например (341.4, 234,7).

Тем не менее, целые числа должны использоваться только на заключительном этапе рисования. При расчете движения объекта, скорости и т. Д. Вам нужно использовать числа с плавающей запятой. Целые числа вызовут удивительное количество проблем точности. Рассмотрим следующий фрагмент:

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

Если a и x являются числами с плавающей запятой, x в конечном итоге будет иметь ожидаемое число 1. Если они целые, вы получите 0.

Базовая линия: использовать типы с плавающей запятой для физических расчетов и преобразовать в int во время рисования. Это позволит вам выполнять физические расчеты с необходимой точностью.

EDIT:

Что касается преобразования чисел FP в целые числа, в то время как числа FP имеют больший диапазон, значения, полученные при физических вычислениях после нормализации по размеру области рисования, обычно не должны превышать тип int.

Тем не менее, Java усекает числа с плавающей запятой при преобразовании в целочисленный тип, который может создавать артефакты (например, анимацию без пикселей в крайнем правом столбце пикселей, например, из-за преобразования 639.9 в 639 вместо 640). Возможно, вы захотите взглянуть на Math.round() или на некоторые другие методы округления, предоставляемые Java, для более разумных результатов.

4 голосов
/ 02 ноября 2011

Java усекает десятичные дроби.Например:

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

Причина невозможности рисовать в плавающей позиции заключается просто в том, что нет половины пикселей и т. Д. :)

2 голосов
/ 02 ноября 2011

Java переводит значения с плавающей точкой в ​​int, отбрасывая десятичную дробь. Но я не думаю, что иметь координаты x и y в поплавках имеет смысл. У вас есть пиксель на экране, который не может быть представлен ни в чем, кроме одного пикселя. Например, вы не можете нарисовать пиксель .5px x .5px, потому что на экране это будет просто 1px x 1px пиксель. Я не программист компьютерных игр, но я написал один движок анимации на Java, и это было очень гладко. Я могу поделиться этим, если хотите.

Обратите внимание, что вы должны рисовать, используя целые числа, но все вычисления выполняйте с использованием двойных чисел Для таких вещей, как вращение или что-либо, что основано на математической формуле, должно быть сделано в десятичной форме.

1 голос
/ 02 ноября 2011

Причина, по которой x и y должны быть двойными, заключается в том, что их нужно вычислять математически, например:

x += (delta * dx) / 1000;

Вы хотите избежать переполнений и потери точности вплоть до рисования пикселя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...