문제는 :삼각법/부동 소수점 문제
간단한 SDL 2.0.4 응용 프로그램 (하향식 (top-down) 이동/회전 시도)로 math.h의 삼각 함수를 사용하여, 나는 약간의 오류에서이 있었다는 것을 발견 삼각법 계산 결과, '플레이어'가 직면하고있는 방향으로 정확히 움직이지 않아서 나를 많이 괴롭혔습니다. 왜 이것이 될 수 있는지 검색해 보았습니다. 그 주된 이유는 부동 소수점 산술입니다.
나는 libfixmath라는 고정 소수점 수학 라이브러리를 사용했다. 문제는 해결되었지만 어느 정도까지만 해결되었다. 라디안으로 반환 된 90 도의 코사인은 0이 아닌 0.00775146입니다. 그러나 270 도의 코사인은 0 라디안을 반환했습니다! 나는이 문제가 나를 찔 렸고 약간의 도움이 필요하다는 것을 인정해야한다. (나의 수학 기술은별로 도움이되지 않는다.) 고정 소수점 연산에서 사용
변수 :
double direction = 0.0;
double sinRadians = 0.0;
double cosRadians = 1.0; // presuming player starts facing direction of 0 degrees!
그리고 'INT의 main (int argc, 문자 *는 argv [])'과 관련된 이러한 변수의 일부 :
if (keyDownW == true)
{
Player.setXPos(Player.getXPos() + (10 * sinRadians));
Player.setYPos(Player.getYPos() - (10 * cosRadians)); // +- = -
cout << "Cosine and Sine (in radians): " << cosRadians << ", " << sinRadians << endl;
cout << direction << " degrees \n" << endl;
}
else if (keyDownS == true)
{
Player.setXPos(Player.getXPos() - (6 * sinRadians));
Player.setYPos(Player.getYPos() + (6 * cosRadians)); // -- = +
}
if (keyDownA == true)
{
if (direction <= 0)
{
direction = 345;
}
else
{
direction -= 15;
}
direction = direction * (3.14159/180); // convert to radians
cosRadians = fix16_to_dbl(fix16_cos(fix16_from_dbl(direction)));
sinRadians = fix16_to_dbl(fix16_sin(fix16_from_dbl(direction)));
direction = direction * (180/3.14159); // convert back to degrees
}
else if (keyDownD == true)
{
if (direction >= 345)
{
direction = 0;
}
else
{
direction += 15;
}
direction = direction * (3.14159/180); // convert to radians
cosRadians = fix16_to_dbl(fix16_cos(fix16_from_dbl(direction)));
sinRadians = fix16_to_dbl(fix16_sin(fix16_from_dbl(direction)));
direction = direction * (180/3.14159); // convert back to degrees
}
cosRadians과 sinRadian이 할당되면 일어나는 일은 방향 (라디안에서 각도로 변환 됨)이 고정 소수점 숫자로 변환 된 다음 코사인과 사인을 개별적으로 계산 한 다음 고정 소수점에서 변환 된 것입니다 배정을 위해 숫자를 이중으로 되돌리고, 모두를 libfixmath 라이브러리의 se. 여기
현재 프로그램 (필요한 .dll 파일과 함께이 .exe로 컴파일 나는 정적 libfixmath 라이브러리를 링크) 그래서 당신은 자신에 대한 문제를 볼 수 있습니다 https://mega.nz/#!iJggRbxY!ySbl-2X_oiJKFACyp_kLg9yuLcEsFM07lTRqLtKCsy4어떤 아이디어 왜 이것으로 일어나고있다 ?
고정 소수점 변환을 별도의 단계로 세분화하고 중간 값을 살펴 봅니다. 정확성이 감소한다는 것을 강력하게 의심합니다. – doug
라디안 변환에서 pi와 같은 근사한 근사값을 사용하는 이유는 무엇입니까? pi에 가장 가까운 double은 3.141592653589793 –
입니다. NSEW 만 움직일 수 있다면 왜 float을 사용하고 있습니까? – stark