2013-12-22 1 views
1

각도와 관련된 몇 가지 문제가 발생했습니다. 저는 각도 A와 다른 각도 B를 가지고 있습니다. A를 가장 짧은 길이로 움직여서 B에 도달하게하고 싶습니다. 제 첫 번째 혼란은 각도가 0에서 180, 그리고 0에서 -180까지입니다. 그것의 찬성이 무엇인지 확실하지 않습니다. 이 B에 도달 할 때까지, 내가 하나를 추가하거나에서 1 개 정도를 뺄하거나 할 각 업데이트에 대한각도에 더하거나 빼서 가장 짧은 각도에 도달

float a = -35; 
float b = 90; 

, 그리고 그것이 가장 짧은 길을 간다 있는지 확인하려면 : 어쨌든, 나는 인스턴스에 대한 줄 것이다.

다음은 작동하는 것 같은 제 코드입니다. 그러나 매우 효율적으로 보이지는 않습니다.

b += 360; 
if (b > a) { 
    if (b - a < 180) { 
     a += 1; 
    } else { 
     a -= 1; 
    } 
} else { 
    if (a - b < 180) { 
     a -= 1; 
    } else { 
     a += 1; 
    } 
} 

더 나은/더 쉬운 방법이 있습니까?

+0

왜이 루프가 있어야하는지 루프가 포함되어 있지 않으므로 함께 연주 할 수있는 완전한 예제가 있습니다. –

+2

모듈로 산술을 사용하십시오. 루프를 시작하기 전에 모든 반복에서가 아니라 한 번 방향을 계산하십시오. –

+0

@OliCharlesworth OP는 수레를 사용하기 때문에 모듈로 산술은 명백한 옵션이 아닙니다. –

답변

3

a에서 b까지 최단 경로를 원합니다. 결과의 값보다 큰 180 우리는 360

if (d > 180) { 
    d -= 360; 
} else if (d<-180) { 
    d += 360; 
} 

을 빼기 할 경우 이제 d는 전체가

float d = a-b; 

: 우리가 차이를보고 있기 때문에

은 빼기 수 있습니다 여행 거리. 이를 0과 비교하여 어느 방향으로 가는지 확인할 수 있습니다. 큰 물건을 더 멀리 움직이는 것과 같은 좋은 일도 할 수 있습니다. 예를 들어이 항상 방식의 10 %를 이동하게하려면 (그 시나리오에 대처하기 위해 필요 있도록 지속적으로 더 작은 양으로 접근하므로이 시리즈는 절대 끝나지 않습니다) :

a += d/10; 

을 또한 필요 부드러운 애니메이션을 원하면 프레임 속도를 고려하십시오.

tpf (프레임 당 시간)를 1 초의 부동 소수점으로 계산하면. 우리가 이동하는 경우,

float move = degreesPerFrame * tpf; 

확인 우리가 대상을지나 이동하지 않을 수 있습니다 : (degreesPerFrame 애니메이션의 속도입니다)

long frameTook = lastFrame - System.currentTimeMillis(); 
long lastFrame = System.currentTimeMillis(); 
float tpf = frameTook/1000; 

이제 사용하여 일정한 애니메이션을 할 수 그것.

if (move > FastMath.abs(d)) { 
    a = b; 
} else { 
    if (d>0) { 
     a+=move; 
    } else { 
     a-=move; 
    } 
} 
관련 문제