#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846f
int main( void )
{
FILE *fp;
fopen_s( &fp, "DEFINECOS.h", "w");
fprintf(fp,"#ifndef _DEFINECOS_H_\n#define _DEFINECOS_H_\n\nnamespace MATH \n{\n ");
fprintf(fp,"\tconst float COS_VALUE[360] = \n\t{");
for( int i = 0 ; i < 359; i++ )
{
if( i % 10 == 0 )
{
fprintf(fp,"\n\t\t");
}
fprintf(fp, "ff, ", cos( i * (PI /180.0f) ) );
}
fprintf(fp, "ff\n\t};", cos(359 *(PI /180.0f) ));
fprintf(fp, "\n\tinline float COS( int degree ) { return COS_VALUE[degree`]; }\n};");
fprintf(fp, "\n\n#endif");
return 0;
}
그냥 이렇게 헤더 만들어 쓰는게 좋지않음??
1도씩 했네 ㅋㅋ 누구코에 못붙이겠다.
그래도 시도는 좋음 : ) 그렇게 쓰는거야.
보통 sin cos 8방향 대칭성을 이용해서 45도만 좀 더 해상력을 높여서(256단계 정도) 처리하곤 해 : ) 통째로 한 바퀴 돌릴려면 최소 0.1도 (고정소수점)
1/16 도 정도 되면 쓸만해지긴 하지.
흠.. 1/16씩하면 인터페이스를 어떻게 해야할까 고민이네요..
interpolation을 적용하는 것도 한번 생각해 보시면 재미있을 것 같은데요. 예를 들어 0.01 단위로 -pi부터 +pi까지 table로 가지고 있을 때 sin(0.003)을 요구할 경우 어떻게 출력 값을 내보내야 할까? 같은 거 말이죠. 가장 단순하게 구현하면 (sin(0.00) + sin(0.01))*3/10이 될 거고...
inline float SIN( float degree ) { return SIN_VALUE[static_cast<int>( degree*16 ) % 5760 ]; }
걍 이렇게했어요 ㅋㅋ
1/16도라는건 각도를 16배 해서 정수로 바꾸고 정수 레벨에선 >> 4, << 4 를 이용해서 고정소수점 처리를 한다는거야.