{"id":52,"date":"2022-03-23T22:08:49","date_gmt":"2022-03-23T22:08:49","guid":{"rendered":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/"},"modified":"2022-03-23T22:08:49","modified_gmt":"2022-03-23T22:08:49","slug":"desenhando-linhas-e-pontos","status":"publish","type":"page","link":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/","title":{"rendered":"Desenhando linhas e pontos"},"content":{"rendered":"<p>&#013;<\/p>\n<div class=\"NAVHEADER\">&#013;<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<th align=\"middle\" colspan=\"3\">Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013;<br \/>\nOpenGL<\/th>\n<\/tr>\n<p>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"bottom\" align=\"left\" width=\"10%\"><a href=\"compilando-programas.html\">Prev<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"bottom\" align=\"middle\" width=\"80%\" \/>&#013;<\/p>\n<td valign=\"bottom\" align=\"right\" width=\"10%\"><a href=\"desenhando-outros.html\">Next<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<hr align=\"left\" width=\"100%\" \/>&#013;\n<\/div>\n<p>&#013;<\/p>\n<div class=\"CHAPTER\">&#013;<\/p>\n<h1><a name=\"DESENHANDO-LINHAS-PONTOS\">Cap\u00edtulo 2. Desenhando linhas e &#013;<br \/>\npontos<\/a><\/h1>\n<p>&#013;<\/p>\n<div class=\"TOC\">&#013;<\/p>\n<dl>&#013;<\/p>\n<dt><b>\u00cdndice<\/b>&#013;<\/p>\n<dt>2.1. <a href=\"desenhando-linhas-pontos.html#AEN174\">Descri\u00e7\u00e3o &#013;<br \/>\n  do programa <tt class=\"FILENAME\">linha.c<\/tt><\/a>&#013;<\/p>\n<dt>2.2. <a href=\"desenhando-outros.html\">Outros programas relacionados<\/a><\/dt>\n<p>&#013;<\/p>\n<dt>2.3. <a href=\"desenhando-exercicios.html\">Exerc\u00edcios<\/a><\/dt>\n<\/dt>\n<\/dt>\n<\/dl>\n<\/div>\n<p>&#013;<\/p>\n<p>O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 entender recursos fundamentais da biblioteca OpenGL &#013;<br \/>\ne da biblioteca auxiliar GLUT, tais como abrir uma janela, definir sistemas de &#013;<br \/>\ncoordenadas, limpar a tela e especificar cores de desenho. Este prop\u00f3sito ser\u00e1 &#013;<br \/>\nalcan\u00e7ado atrav\u00e9s da an\u00e1lise do programa <a href=\"linha.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">linha.c<\/tt><\/a>, mostrado no <a href=\"desenhando-linhas-pontos.html#EXAMPLE-LINHA\">Exemplo &#013;<br \/>\n2-1<\/a>, cuja \u00fanica funcionalidade desenhar uma reta entre dois pontos de uma &#013;<br \/>\njanela gr\u00e1fica. <\/p>\n<p>&#013;<\/p>\n<div class=\"EXAMPLE\">&#013;<\/p>\n<p><b><a name=\"EXAMPLE-LINHA\">Exemplo 2-1. programa <\/a><a href=\"linha.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">linha.c<\/tt><\/a><\/b><\/p>\n<p>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">#include &lt;GL\/glut.h&gt;&#013;\n#include &lt;stdlib.h&gt;&#013;\n&#013;\n\/\/ prototipos das funcoes&#013;\nvoid init(void);&#013;\nvoid display(void);&#013;\nvoid keyboard(unsigned char key, int x, int y);&#013;\n&#013;\n\/\/ funcao principal&#013;\nint main(int argc, char** argv){&#013;\n  glutInit(&amp;argc, argv);                              \/\/ inicializa o glut&#013;\n  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);           \/\/ especifica o uso de cores e buffers&#013;\n  glutInitWindowSize (256, 256);                          \/\/ especifica as dimensoes da janela&#013;\n  glutInitWindowPosition (100, 100);                      \/\/ especifica aonde a janela aparece na tela&#013;\n  glutCreateWindow (\"Desenhando uma linha\");              \/\/ cria a janela&#013;\n  init();&#013;\n  glutDisplayFunc(display);                               \/\/ funcao que sera redesenhada pelo GLUT&#013;\n  glutKeyboardFunc(keyboard);                             \/\/ funcoes de teclado&#013;\n  glutMainLoop();                                         \/\/ mostra todas as janelas criadas&#013;\n  return 0;&#013;\n}&#013;\n&#013;\n\/\/ definicao de cada funcao&#013;\n&#013;\nvoid init(void){&#013;\n  glClearColor(1.0, 1.0, 1.0, 1.0);    \/\/ cor de fundo&#013;\n  glOrtho (0, 256, 0, 256, -1 ,1);     \/\/ modo de projecao ortogonal&#013;\n} &#013;\n&#013;\nvoid display(void){&#013;\n  glClear(GL_COLOR_BUFFER_BIT);               \/\/ limpa a janela&#013;\n  glColor3f (0.0, 0.0, 0.0);                  \/\/ cor da linha&#013;\n  glBegin(GL_LINES);&#013;\n  glVertex2i(40,200);  glVertex2i(200,10);    \/\/ coordenadas inicial e final da linha&#013;\n  glEnd();&#013;\n  glFlush();&#013;\n}&#013;\n&#013;\nvoid keyboard(unsigned char key, int x, int y){&#013;\n  switch (key) {&#013;\n  case 27:                                         \/\/ tecla Esc (encerra o programa)&#013;\n\texit(0);&#013;\n\tbreak;&#013;\n  }&#013;\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>&#013;<\/p>\n<p>Para compilar e executar o programa <a href=\"linha.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">linha.c<\/tt><\/a>, salve-o juntamente com o &#013;<br \/>\narquivo <a href=\"Makefile\" target=\"_top\" rel=\"noopener\">Makefile<\/a> em um diret\u00f3rio e execute a seguinte seq\u00fc\u00eancia de &#013;<br \/>\ncomandos:<\/p>\n<p>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"SCREEN\"><tt class=\"PROMPT\">$<\/tt> <b class=\"COMMAND\">make<\/b> <span class=\"OPTION\">linha<\/span>&#013;\n<tt class=\"PROMPT\">$<\/tt> <b class=\"COMMAND\">linha<\/b><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p>A sa\u00edda do programa <b class=\"COMMAND\">linha<\/b> \u00e9 mostrado na <a href=\"desenhando-linhas-pontos.html#FIG-LINHA\">Figura &#013;<br \/>\n2-1<\/a>.<\/p>\n<p>&#013;<\/p>\n<div class=\"FIGURE\">&#013;<\/p>\n<p><b><a name=\"FIG-LINHA\">Figura 2-1. sa\u00edda do programa <b class=\"COMMAND\">linha<\/b><\/a><\/b><\/p>\n<p><font color=\"red\"><font color=\"red\"><font color=\"red\" \/><\/font><\/font>&#013;<\/p>\n<p><img decoding=\"async\" src=\"linha.jpg\" \/><\/p>\n<\/div>\n<p>&#013;<\/p>\n<div class=\"SECT1\">&#013;<\/p>\n<h1 class=\"SECT1\"><a name=\"AEN174\">2.1. Descri\u00e7\u00e3o do programa <tt class=\"FILENAME\">linha.c<\/tt><\/a><\/h1>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">#include &lt;GL\/glut.h&gt;&#013;\n#include &lt;stdlib.h&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Estes includes definem os prot\u00f3tipos das fun\u00e7\u00f5es utilizadas pelo programa. &#013;<br \/>\n<tt class=\"FILENAME\">stdlib.h<\/tt> cont\u00e9m o prot\u00f3tipo da fun\u00e7\u00e3o <span class=\"CITEREFENTRY\"><span class=\"REFENTRYTITLE\">exit<\/span>(3)<\/span>; O arquivo de &#013;<br \/>\ncabe\u00e7alho <tt class=\"FILENAME\">glut.h<\/tt> inclui, al\u00e9m dos prot\u00f3tipos das fun\u00e7\u00f5es &#013;<br \/>\nGLUT, os arquivos <tt class=\"FILENAME\">gl.h<\/tt> e <tt class=\"FILENAME\">glu.h<\/tt>, &#013;<br \/>\nque cont\u00e9m os prot\u00f3tipos das fun\u00e7\u00f5es principais e auxiliares do OpenGL.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void init(void);&#013;\nvoid display(void);&#013;\nvoid keyboard(unsigned char key, int x, int y);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Fun\u00e7\u00f5es implementadas ap\u00f3s a fun\u00e7\u00e3o <span class=\"CITEREFENTRY\"><span class=\"REFENTRYTITLE\">main<\/span><\/span> devem ser prototipadas aqui, de modo a &#013;<br \/>\nevitar erros de compila\u00e7\u00e3o.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">int main(int argc, char** argv){<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Todo programa em C\/C++ inicia com a fun\u00e7\u00e3o <span class=\"CITEREFENTRY\"><span class=\"REFENTRYTITLE\">main<\/span><\/span>. <\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutInit(&amp;argc, argv);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Inicializa a biblioteca GLUT e negocia uma se\u00e7\u00e3o com o gerenciador de &#013;<br \/>\njanelas. \u00c9 poss\u00edvel passar argumentos para a fun\u00e7\u00e3o glutInit provenientes da &#013;<br \/>\nlinha de execu\u00e7\u00e3o, tais como a vari\u00e1vel de ambiente <tt class=\"ENVAR\">DISPLAY<\/tt>, ou informa\u00e7\u00f5es sobre a geometria da tela.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Informa \u00e0 biblioteca GLUT o modo do display a ser utilizado quando a janela &#013;<br \/>\ngr\u00e1fica for criada. O <i class=\"FOREIGNPHRASE\">flag<\/i> <tt class=\"PARAMETER\"><i>GLUT_SINGLE<\/i><\/tt> for\u00e7a o uso de uma janela com <i class=\"FOREIGNPHRASE\">buffer<\/i> simples, significando que todos os desenhos ser\u00e3o &#013;<br \/>\nfeitos diretamente nesta janela. O <i class=\"FOREIGNPHRASE\">flag<\/i> <tt class=\"PARAMETER\"><i>GLUT_RGB<\/i><\/tt> diz que o modelo de cor utilizado ser\u00e1 o &#013;<br \/>\nRGB.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutInitWindowSize (256, 256); &#013;\n  glutInitWindowPosition (100, 100); <\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Define o tamanho inicial da janela, 256&#215;256 pixels, e a posi\u00e7\u00e3o inicial do &#013;<br \/>\nseu canto superior esquerdo na tela, (x, y)=(100, 100). <\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutCreateWindow (\"Desenhando uma linha\");<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Cria uma janela e define seu t\u00edtulo como &#8220;<span class=\"GUILABEL\">Desenhando uma &#013;<br \/>\nlinha<\/span>&#8220;.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  init();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Nesta fun\u00e7\u00e3o \u00e9 definido o estado inicial do OpenGL, antes de qualquer desenho &#013;<br \/>\nseja feito.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutDisplayFunc(display); <\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Define <tt class=\"FUNCTION\">display()<\/tt> como a fun\u00e7\u00e3o de desenho (<i class=\"FOREIGNPHRASE\">display callback<\/i>) para a janela corrente. Quando GLUT &#013;<br \/>\ndetermina que esta janela deve ser redesenhada, a fun\u00e7\u00e3o de desenho \u00e9 chamada. A &#013;<br \/>\nfun\u00e7\u00e3o de desenho deve possuir o seguinte prot\u00f3tipo:<\/p>\n<p>&#013;<\/p>\n<div class=\"FUNCSYNOPSIS\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<p><code><code class=\"FUNCDEF\">void funcao()<\/code>(void);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutKeyboardFunc(keyboard);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Indica que sempre que uma tecla for pressionada no teclado, GLUT dever\u00e1 chama &#013;<br \/>\na fun\u00e7\u00e3o <tt class=\"FUNCTION\">keyboard()<\/tt> para tratar eventos de teclado (<i class=\"FOREIGNPHRASE\">keyboard callback<\/i>). A fun\u00e7\u00e3o de teclado deve possuir o &#013;<br \/>\nseguinte prot\u00f3tipo:<\/p>\n<p>&#013;<\/p>\n<div class=\"FUNCSYNOPSIS\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<p><code><code class=\"FUNCDEF\">void funcao()<\/code>(unsigned char key, int x, int &#013;<br \/>\ny);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutMainLoop();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Inicia o <i class=\"FOREIGNPHRASE\">loop<\/i> de processamento de desenhos com &#013;<br \/>\nGLUT. Esta rotina deve ser chamada pelo menos uma vez em um programa que utilize &#013;<br \/>\na biblioteca GLUT.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  return 0;&#013;\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Finaliza o programa.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void init(void){&#013;\n  glClearColor(1.0, 1.0, 1.0, 1.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Especifica as intensidade de vermelho (<i class=\"FOREIGNPHRASE\">RED<\/i>), verde &#013;<br \/>\n(<i class=\"FOREIGNPHRASE\">GREEN<\/i>) e azul (<i class=\"FOREIGNPHRASE\">BLUE<\/i>) &#013;<br \/>\nutilizadas para limpar a janela. Cada par\u00e2metro pode varia de 0 a 1, o &#013;<br \/>\nequivalente a uma varia\u00e7\u00e3o de 0 a 255, usada convecionalmente no sistema de &#013;<br \/>\njanelas. O \u00faltimo argumento \u00e9 o canal alfa, usado para compor superf\u00edcies &#013;<br \/>\ntransparentes ou translucentes. Como estes conceitos ainda n\u00e3o foram apresentados, o canal &#013;<br \/>\nalfa deve ser mantido com valor igual a 1.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glOrtho (0, 256, 0, 256, -1 ,1);&#013;\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o glOrtho define as coordenadas do volume de recorte (<i class=\"FOREIGNPHRASE\">clipping volume<\/i>), possuindo o seguinte prot\u00f3tipo:<\/p>\n<p>&#013;<\/p>\n<div class=\"FUNCSYNOPSIS\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<p><code><code class=\"FUNCDEF\">void glOrtho()<\/code>( GLdouble left , GLdouble &#013;<br \/>\nright , GLdouble bottom , GLdouble top , GLdouble zNear , GLdouble zFar &#013;<br \/>\n);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Os par\u00e2metros <tt class=\"PARAMETER\"><i>left<\/i><\/tt> e <tt class=\"PARAMETER\"><i>right<\/i><\/tt> especificam as coordenadas esquerda e direita, &#013;<br \/>\nrespectivamente, dos planos de corte verticais. Os par\u00e2metros <tt class=\"PARAMETER\"><i>bottom<\/i><\/tt> e <tt class=\"PARAMETER\"><i>top<\/i><\/tt> &#013;<br \/>\nespecificam as coordenadas inferior e superior, respectivamente, dos planos de &#013;<br \/>\ncorte horizontais. <tt class=\"PARAMETER\"><i>zNear<\/i><\/tt> e <tt class=\"PARAMETER\"><i>zFar<\/i><\/tt>, por sua vez, especificam a coordenada mais &#013;<br \/>\npr\u00f3xima e mais distante do observador, respectivamente, no eixo de profundidade. &#013;<br \/>\nAssim, o volume de recorte definido no exemplo ser\u00e1 x<sub>min<\/sub>=0 e &#013;<br \/>\nx<sub>max<\/sub>=256; y<sub>min<\/sub>=0 e y<sub>max<\/sub>=256; z<sub>min<\/sub>=-1 &#013;<br \/>\ne z<sub>max<\/sub>=1.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void display(void){&#013;\n  int i;&#013;\n  glClear(GL_COLOR_BUFFER_BIT);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glClear()<\/tt> serve para limpar <i class=\"FOREIGNPHRASE\">buffers<\/i> utilizados pelo OpenGL com valores &#013;<br \/>\npr\u00e9-definidos. A m\u00e1scara utilizada neste exemplo, <tt class=\"PARAMETER\"><i>(GL_COLOR_BUFFER_BIT<\/i><\/tt>, diz \u00e0 fun\u00e7\u00e3o <tt class=\"FUNCTION\">glClear()<\/tt> que apenas o <i class=\"FOREIGNPHRASE\">buffer<\/i> de &#013;<br \/>\ndesenho deve ser limpo. Ap\u00f3s a execu\u00e7\u00e3o desta fun\u00e7\u00e3o, a tela ficar\u00e1 branca, uma &#013;<br \/>\nvez que a <tt class=\"FUNCTION\">init()<\/tt> define (R, G, B)=(1.0, 1.0, 1.0) como &#013;<br \/>\ncor de limpeza de tela.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glColor3f (0.0, 0.0, 0.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Especifica (R, G, B)=(0, 0, 0), preto, como a cor de desenho. Todos os &#013;<br \/>\nobjetos desenhados a partir daqui ter\u00e3o cor preta.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glBegin(GL_LINES);&#013;\n  glVertex2i(40,200);  glVertex2i(200,10);&#013;\n  glEnd();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>As fun\u00e7\u00f5es <tt class=\"FUNCTION\">glBegin()<\/tt> e <tt class=\"FUNCTION\">glEnd()<\/tt> delimitam os v\u00e9rtices de uma primitiva de desenho ou &#013;<br \/>\nde um grupo de primitivas. O par\u00e2metro passado para a fun\u00e7\u00e3o especifica o tipo &#013;<br \/>\nde primitiva a ser desenhado. Neste exemplo, o par\u00e2metro <tt class=\"PARAMETER\"><i>GL_LINES<\/i><\/tt> indica que os v\u00e9rtices especificados devem &#013;<br \/>\nser tratados como pares de pontos que compor\u00e3o segmentos de reta independentes. &#013;<br \/>\nA fun\u00e7\u00e3o <tt class=\"FUNCTION\">glVertex2i()<\/tt> define as coordenadas de um &#013;<br \/>\nv\u00e9rtice.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void keyboard(unsigned char key, int x, int y){&#013;\n  switch (key) {&#013;\n  case 27:&#013;\n\texit(0);&#013;\n\tbreak;&#013;\n  }&#013;\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Conforme mencionado, a fun\u00e7\u00e3o <tt class=\"FUNCTION\">keyboard()<\/tt> serve para &#013;<br \/>\ntratar eventos de teclado. Sua implementa\u00e7\u00e3o especifica que quando a tecla <b class=\"KEYCAP\">ESC<\/b> (<i class=\"FOREIGNPHRASE\">keycode<\/i>=<span class=\"KEYCODE\">27<\/span>) for pressionada o programa dever\u00e1 ser &#013;<br \/>\nfinalizado.<\/p>\n<\/div>\n<\/div>\n<p>&#013;<\/p>\n<div class=\"NAVFOOTER\">&#013;<\/p>\n<hr align=\"left\" width=\"100%\" \/>&#013;<br \/>\n&#013;<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"top\" align=\"left\" width=\"33%\"><a href=\"compilando-programas.html\">Prev<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"middle\" width=\"34%\"><a href=\"index2005.html\">Home<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"right\" width=\"33%\"><a href=\"desenhando-outros.html\">Next<\/a><\/td>\n<\/tr>\n<p>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"top\" align=\"left\" width=\"33%\">Compilando programas que utilizam &#013;<br \/>\n      OpenGL<\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"middle\" width=\"34%\">\u00a0<\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"right\" width=\"33%\">Outros programas relacionados<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; Cap\u00edtulo 2. Desenhando linhas e &#013; pontos &#013; &#013; &#013; \u00cdndice&#013; 2.1. Descri\u00e7\u00e3o &#013; do programa linha.c&#013; 2.2. Outros programas relacionados &#013; 2.3. Exerc\u00edcios &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 entender recursos fundamentais &hellip; <a href=\"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/\" class=\"more-link\">Continuar lendo <span class=\"screen-reader-text\">Desenhando linhas e pontos<\/span><\/a><\/p>\n","protected":false},"author":48,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-52","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD\" \/>\n<meta property=\"og:description\" content=\"&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; Cap\u00edtulo 2. Desenhando linhas e &#013; pontos &#013; &#013; &#013; \u00cdndice&#013; 2.1. Descri\u00e7\u00e3o &#013; do programa linha.c&#013; 2.2. Outros programas relacionados &#013; 2.3. Exerc\u00edcios &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 entender recursos fundamentais &hellip; Continuar lendo Desenhando linhas e pontos\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/\" \/>\n<meta property=\"og:site_name\" content=\"Marco Antonio Garcia de Carvalho, PhD\" \/>\n<meta property=\"og:image\" content=\"http:\/\/linha.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/desenhando-linhas-e-pontos\\\/\",\"url\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/desenhando-linhas-e-pontos\\\/\",\"name\":\"Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/#website\"},\"datePublished\":\"2022-03-23T22:08:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/desenhando-linhas-e-pontos\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/desenhando-linhas-e-pontos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/desenhando-linhas-e-pontos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desenhando linhas e pontos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/#website\",\"url\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/\",\"name\":\"Marco Antonio Garcia de Carvalho, PhD\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/","og_locale":"pt_BR","og_type":"article","og_title":"Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD","og_description":"&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; Cap\u00edtulo 2. Desenhando linhas e &#013; pontos &#013; &#013; &#013; \u00cdndice&#013; 2.1. Descri\u00e7\u00e3o &#013; do programa linha.c&#013; 2.2. Outros programas relacionados &#013; 2.3. Exerc\u00edcios &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 entender recursos fundamentais &hellip; Continuar lendo Desenhando linhas e pontos","og_url":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/","og_site_name":"Marco Antonio Garcia de Carvalho, PhD","og_image":[{"url":"linha.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/","url":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/","name":"Desenhando linhas e pontos - Marco Antonio Garcia de Carvalho, PhD","isPartOf":{"@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/#website"},"datePublished":"2022-03-23T22:08:49+00:00","breadcrumb":{"@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/desenhando-linhas-e-pontos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wordpress.ft.unicamp.br\/magic\/"},{"@type":"ListItem","position":2,"name":"Desenhando linhas e pontos"}]},{"@type":"WebSite","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/#website","url":"https:\/\/wordpress.ft.unicamp.br\/magic\/","name":"Marco Antonio Garcia de Carvalho, PhD","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wordpress.ft.unicamp.br\/magic\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"}]}},"_links":{"self":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages\/52","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/comments?post=52"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages\/52\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/media?parent=52"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}