Top.Mail.Ru
Ответы

C++ openGL прорисовка графиков

как сделать что бы ось была статично, а синусоида двигалась во времени
весь код:

#include <GL/glut.h>

#include <math.h>


void display();

void osi();

void timer();


void osi() {

//double delta = 5;

glColor3f(0.0f, 0.0f, 0.0f);//задаем цвет рисования

glLineWidth(3);//задаем толщину линии

glBegin(GL_LINES);//говорим что будем рисовать линию

glVertex2d(-100, 0);

glVertex2d(100, 0);

glVertex2d(0, -100);

glVertex2d(0, 100);


glEnd();

}

void timer(int i = 0) // Таймер (промежуток времени, в котором будет производится все процессы)

{

display(); // Вызов функций

glutTimerFunc(100, timer, 0); // новый вызов таймера( 100 - промежуток времени(в милисекундах), через который он будет вызыватся, timer - вызываемый паблик)

}



void display(){


//glRotatef(1, 0, 0, 1);

glTranslatef(-0.5, 0, 0);

glClear(GL_COLOR_BUFFER_BIT);//очищаем буфер


glColor3f(1.0f, 0.0f, 0.0f);//задаем цвет рисования

glLineWidth(3);//задаем толщину линии

glBegin(GL_LINE_STRIP);//говорим что будем рисовать линию

for (double i = 0; i < 100; i = i+0.1)

{

glVertex2d(i * 10, sin(i)*10);

}


glEnd();

osi();

glutSwapBuffers();


}

int main(int argc, char** argv){

//glutInitWindowSize(1280, 800);

glutInitWindowSize(750, 450);

glutInitWindowPosition(0, 0);

glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE);

glutCreateWindow("Hello");

glClearColor(180, 180, 180, 0);

glScalef(0.01, 0.01, 0.01);

glutDisplayFunc(display);

glutTimerFunc(50, timer, 0);

glutMainLoop();


return 0;

}

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

попробуй так цикл сделай (между glBegin и glEnd)

static double i2 = 0.0;
double pipi = M_PI + M_PI;

for (double i = 0; i < 100; i = i+0.1)
{
glVertex2d(i2 * 10, sin(i2)*10);

i2 += 0.1;

if(i2 > pipi)
i2 = 0;
}

вроде два пи это и есть 360 градусов, значит если ушли за пределы то сбросим i2

M_PI это 3.14159265358979323846

Аватар пользователя

Тут нужны знания геометрии. Ты рисуешь циклом 100 итераций 1 кадр, рисуй например 10 кадров, прибавляя или отнимая число которе прямо влияет на отрисовку синусоиды.

Типа

for (double i = 0; i < 100; i = i+0.1)

{
for (double n = 0; n< 10; n++)
{
glVertex2d(i * 10, sin(i+n)*10);
}
}

Пока все что могу посоветовать это экспериментируй и смотри что будет. А еще неплохо бы тебе понять как именно строится график, как работает синусоида и т.д., без этих знаний будет трудно.

Я когдато рисовал подобное, если бы у тебя была формула типа y=sin(x)+10 для отрисовки точек на графике, а не функция отрисовки линии, ты было бы проще понять, что y=sin(x+n)+10 дает динамику изменения высоты построения точки на следующем кадре изменяя координату у, высоту построения, а координата х вычисляясь без изменений удержит график возле оси.

Зы если держать координату Х=0 при отрисовке точки на графике, то она должна начать бегать вверх-вниз, если график строится правильно.