2011-11-02 2 views
6

몇 가지 간단한 2D 게임 프로그래밍을 연습 중이며 애니메이션 중에 (이미지 위치의 실제 변화가 부동 소수점 숫자로 계산되는 것이 가장 좋습니다) 이론이 떠 올랐습니다. int로 이미지를 움직이면 애니메이션이 부드럽 지 않을 것이라는 느낌이 들었습니다.double (또는 float)을 int로 변환하면 어떻게됩니까?

자바에서는 이미지에 위치를 부여하기 위해 부동 소수점 숫자로 이미지를 그릴 수 없습니다. 그러나 처음에 사용자가 xy을 선언 할 때 Double 또는 Float로 선언 할 수 있으며 실제로 이미지를 그리는 데는 int로 변환해야합니다. 마찬가지로 나는 HERE 찾을 :

/** 
* 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); 
} 

내 질문은 자바 변환을 처리하는 방법에 관한 것입니다? 코드가 마지막 순간에이 두 배를 캐스팅 한 경우, 왜 처음에 배가 되는가? 자바는 소수점 뒤에 숫자를 숨기나요?

나는 C와 C++에서 소수점 이하 자릿수가 잘린 것을 알기 때문에 그 앞에 무엇이 보이는지 만 알 수있다. Java가이 캐스팅을 어떻게 처리합니까?

+2

C, C++와 마찬가지로 10 진수 만 삭제합니다. http://www.fluffycat.com/Java/Casting/ – dmcnelis

+0

가능한 한 두 배로 계산해야하며, 마지막으로 int를 받아들이는 메서드에 전달하면 Math.round()를 수행합니다. – Stephan

답변

4

디스플레이의 픽셀은 이산되고 제한적입니다. 따라서 디스플레이 좌표는 정수가되어야합니다. 부동 소수점 숫자는 의미가 없습니다. (341.4, 234,7).

즉, 정수는 최종 드로잉 단계에서만 사용해야합니다. 오브젝트 이동, 속도 등을 계산할 때 부동 소수점 숫자를 사용해야합니다. 정수는 놀라운 수의 정밀도 문제를 일으킬 것입니다. 다음 코드를 고려 부동 소수점 수있다

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

a 경우와 x, x 마침내 1의 예상 수있을 것이다. 정수 인 경우 0이됩니다.

기준선 : 물리 계산에 부동 소수점 유형을 사용하고 그리기 시간에 int으로 변환합니다. 그러면 필요한만큼 정밀도로 물리 계산을 수행 할 수 있습니다.

EDIT :

FP 번호가 큰 범위를 가지고있는 동안 한국인 정수로 FP 번호의 변환에 관한 한, 그 값은 일반적으로 오버 플로우 안 도면 영역 크기 정규화 후에 물리 연산에 의해 생성 된 int 유형. (639.9639보다는 640 변환되는 가령에 의한 우측 화소 열 없음 픽셀 예컨대 애니메이션) 아티팩트를 생성 할 수있는 정수형으로 변환 할 때 상기

는 자바 부동 소수점 수를 잘라. 좀 더 합리적인 결과를 얻으려면 Math.round() 또는 Java에서 제공하는 다른 반올림 메소드를 사용하는 것이 좋습니다.

2

Java 캐스트는 10 진수를 제거하여 int로 float됩니다. 그러나 나는 float에서 x와 y 좌표를 갖는 것이 의미가 없다고 생각합니다. 한 픽셀 미만으로 표시 할 수없는 픽셀이 화면에 있습니다. 예를 들어 화면에 1px x 1px 픽셀 일 것이므로 .5px x .5px 픽셀을 그릴 수 없습니다. 나는 컴퓨터 게임 프로그래머가 아니지만 Java로 하나의 애니메이션 엔진을 작성했으며 매우 매끄 럽습니다. 네가 원한다면 나는 이것을 나눌 수있다.

int를 사용하여 그려야하지만 double을 사용하여 모든 계산을 수행해야합니다. 회전 또는 수학 공식에 의존하는 모든 것을 10 진수로 수행해야합니다.

+1

수레는 여러 가지 이유로 유용합니다 - 그 중에서도'sin' /'cos' (실제 회전에 거의 필수적 임)가 실질적으로 필요하기 때문에 많은 행렬 연산은 숫자가 소수 값을 가질 수있는 기능을 활용할 수 있습니다. int로 변환하면 많은 유연성을 잃어 버리게됩니다 (정수 trig 함수 등을 작성하지 않는 한). 많은 사람들이 절대적으로 int 일 필요가있을 때까지 복식이나 수레로 유지합니다. – cHao

+0

사실입니다. int에서 계산을하는 것을 의미하지는 않습니다. 내 응용 프로그램에서는 여전히 모든 계산을 double로하고 int를 사용하여 그립니다. 이 메모를 반영하여 업데이트하겠습니다. –

+0

@AmirRaminfar 저것 좀 봐도 될까요? – mastrgamr

3

Java는 소수를 자릅니다. 예 :

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

부동의 위치에 그릴 수없는 이유는

+0

알겠습니다. 입력 주셔서 감사합니다, 그건 – mastrgamr

1

이유는 x와 복식 될 Y 필요가 필요할 때입니다 :) 더 반 픽셀 등이 없다는 것을 단순히 예를 들어, 수학적으로 계산할 수 :

당신은 픽셀을 칠 때까지 오버 플로우 및 정밀 최대의 손실을 방지 할
x += (delta * dx)/1000; 

.

+0

그래서 나는 double이 casted 전에 가능한 가장 가까운 정확한 int로 가까이 계산 된 것 같아요? (의미가 O_o 인 경우) – mastrgamr

관련 문제