Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Таблица синуса и косинуса

#cpp #оптимизация


Ради оптимизации решил сделать табличку в которой будут лежать синусы и косинусы.
Рисует почти как надо. 



появляется какой-то пик. не могу понять почему и от куда он берется.

sincos::sincos(){
double step = 6.28318530717958647692 / 4096.0f;
sinTable = new float[4099];
cosTable = new float[4099];
int index = 0;
for (double i = 0; i < 6.28318530717958647692; i += step)
{
    sinTable[index] = std::sin(i);
    cosTable[index] = std::cos(i);
    index++;
}

float sincos::getSin(float val)
{
    val = fmod(val, 6.28318530717958647692);
    return sinTable[(int)(4096.0f * val / 6.28318530717958647692)];
}
float sincos::getCos(float val)
{
    val = fmod(val, 6.28318530717958647692);
    return cosTable[(int)(4096.0f * val / 6.28318530717958647692)];
}

    


Ответы

Ответ 1



В вашей таблице нет никаких пиков - http://ideone.com/T4nigg Так что разбирайтесь с рисованием... #include #include class SinCos { public: SinCos() { double step = 6.28318530717958647692 / 4096.0f; sinTable = new float[4099]; cosTable = new float[4099]; int index = 0; for (double i = 0; i < 6.28318530717958647692; i += step) { sinTable[index] = sin(i); cosTable[index] = cos(i); index++; } maxIdx = index; } float getSin(float val) { val = fmod(val, 6.28318530717958647692); return sinTable[(int)(4096.0f * val / 6.28318530717958647692)]; } float getCos(float val) { val = fmod(val, 6.28318530717958647692); return cosTable[(int)(4096.0f * val / 6.28318530717958647692)]; } float maxSinDelta(); float maxCosDelta(); float* sinTable; float* cosTable; int maxIdx; }; float SinCos::maxCosDelta() { float maxval = 0; for(int i = 0; i < maxIdx; ++i) { float delta = fabs(cosTable[i] - cosTable[(i+1)%maxIdx]); if (maxval < delta) maxval = delta; } return maxval; } float SinCos::maxSinDelta() { float maxval = 0; for(int i = 0; i < maxIdx; ++i) { float delta = fabs(sinTable[i] - sinTable[(i+1)%maxIdx]); if (maxval < delta) maxval = delta; } return maxval; } int main() { SinCos s; printf("MaxDelte sin = %f, cos = %f\n", s.maxSinDelta(), s.maxCosDelta()); }

Комментариев нет:

Отправить комментарий