这就是问题:
下面的参数方程设置曲线,其中t∈R:
x(t)= sin(t)+ 1/2 sin(5t)+ 1/4 cos(2,3t)
y(t)= cos(t)+ 1/2 cos(5t)+ 1/4 sin(2,3t)
使用GL_LINE_STRIP执行白色曲线,使用GL_POINTS执行最后一个曲线 计算出的红点。它应该是实时绘制的 意味着,每时每刻都会计算一个新的点,并且 我们将看到正在构建的曲线,如下图所示。使用 回调计时器,等待时间为10毫秒。线索:使用ortho x和y的范围从-2.0到2.0。
我的代码差不多完成了,但有两个问题。
第一个是:图像不在曲线中!它在计算点之间创建直线。我不知道公式是否错误,如果它在某处或某些地方缺少某些括号。
第二个是:正在创建红点,但旧点仍在那里。我需要做一些事情来删除旧的,但这不是一个大问题,第一个是让我疯狂。
这是我的代码: PS:评论是葡萄牙语,因为它是我的第一语言。
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
void display(void);
void init(void);
void reshape (int w, int h);
void desenhaEixos();
void projecao(void);
void desenhaCurvaLinha(float centerX, float centerY);
void timer (int i);
void desenhaPonto(float centerX, float centerY);
float minX = -2; //Parâmetros do glOrtho
float maxX = 2;
float minY = -2;
float maxY = 2;
float minZ = -1;
float maxZ = 1;
int k = 0;
int main(int argc, char *argv[]){
//Escopo de criação de janela
glutInit(&argc, argv);//Avisa que será criada uma janela
glutInitWindowSize(500,500); //Diz o tamanho da janela
glutInitWindowPosition(10,10); //Diz onde a janela vai abrir na tela, em pixel
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); //Prepara o sistema para a janela a ser criada, é extremamente importante
glutCreateWindow("FreeGLUT Shapes");//Cria a janela
//Escopo de registro de callbacks
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutIdleFunc(idle);
glutTimerFunc(1000/*valor em milesegundos*/, timer, 1);
//Demais
init();
glutMainLoop();//Fica esperando a ação do usuário
return EXIT_SUCCESS;
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);//Limpando o buffer de cor
desenhaCurvaLinha(1, 1);
desenhaPonto(1, 1);
glutSwapBuffers();
}
void init(void){
glClearColor(0,0,0,0);//Escolhe a cor do fundo da janela, nesse caso, preto
}
void desenhaEixos(){
//glLineWidth(3); //Caso queira mudar a espessura da linha
glBegin(GL_LINES); //Indica que vou desenhar linhas
glColor3f(1,0,0); // Vermelho
glVertex3f(minX, 0, 0); //Estamos escrevendo o eixo X na tela
glVertex3f(maxX, 0, 0);// Fui do mínimo até o máximo, da esquerda da tela até a direita
glColor3f(0,1,0); //Verde
glVertex3f( 0, minY, 0);
glVertex3f( 0, maxY, 0);
glColor3f(0,0,1); //Azul
glVertex3f( 0, 0, minZ);
glVertex3f( 0, 0, maxZ);
glEnd();
}
void desenhaCurvaLinha(float centerX, float centerY){
float x, y;
int t;
glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);
for(t=0;t<=k;t++){
x = sin(t) + 0.5 * sin (5 * t) + 0.25 * cos (2.3*t);
y = cos(t) + 0.5 * cos (5 * t) + 0.25 * sin (2.3*t);
glVertex2f(x, y);
}
glEnd();
}
void desenhaPonto(float centerX, float centerY){
float x, y;
int t;
glPointSize(5);
glColor3f(1,0,0);
glBegin(GL_POINTS);
for(t=0;t<=k;t++){
x = sin(t) + 0.5 * sin (5 * t) + 0.25 * cos (2.3*t);
y = cos(t) + 0.5 * cos (5 * t) + 0.25 * sin (2.3*t);
glVertex2f(x, y);
}
glEnd();
}
void reshape (int w, int h){
glViewport(0,0,w,h); //linha protocolo
projecao();
}
void projecao(void){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(minX, maxX, minY, maxY, minZ, maxZ); // Diz agora, que o X da minha janela começa no -10 e termina no 10, o y também.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void timer (int i){
k++;
glutPostRedisplay();
glutTimerFunc(1000, timer, 1);
}
答案 0 :(得分:0)
您可以在点之间获得直线,因为您在点之间绘制直线(并且您可以在像素显示屏上执行所有操作)。
公式中的t
是连续的,t∈R
您的t
并非如此,因为您使用的是数字计算机。
要获得更平滑的曲线&#34;,请在线上各点之间使用小于1的小步。
您还会绘制很多分数,因为您正在使用一个绘制曲线上所有点的循环(我怀疑涉及复制和粘贴)。
删除desenhaPonto
中的循环并仅绘制最后一个点t = k
:
glBegin(GL_POINTS);
x = sin(k) + 0.5 * sin (5 * k) + 0.25 * cos (2.3*k);
y = cos(k) + 0.5 * cos (5 * k) + 0.25 * sin (2.3*k);
glVertex2f(x, y);
glEnd();