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

315
27 декабря 2016, 00:38

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

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

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)];
}
Answer 1

В вашей таблице нет никаких пиков - http://ideone.com/T4nigg

Так что разбирайтесь с рисованием...

#include <math.h>
#include <stdio.h>
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());
}
READ ALSO
Объектный полиморфизм

Объектный полиморфизм

Есть QTabWidget tabsВ нем лежат виджеты вкладок, в каждой вкладке есть layout, в этом layout'e QScrollArea со своим layout'om

339
Несколько классов в одном файле

Несколько классов в одном файле

Является ли дурным тоном описывать и реализовывать несколько классов в одном файле-заголовочнике и одномсрр-файле соответственно? Например,...

692
В созданном шаблоне отсутствует файл с исходным кодом

В созданном шаблоне отсутствует файл с исходным кодом

При создании шаблона проекта С++ в Visual Studio 2015 Update 3, проект собирается, шаблон создается, устанавливается, но в нем отсутствует файл с исходным...

351
Передача указателей в функцию C++

Передача указателей в функцию C++

Вопрос по C++При передаче обычной переменной в функцию создается, как я понимаю, её копия

396