第2課 繪製幾何圖形

來源:互聯網
上載者:User

OpenGL規定,一個多邊形必須是一個“凸多邊形”。注意:如果使用的多邊形不是凸多邊形,

則最後輸出的效果是未定義的——OpenGL為了效率,放寬了檢查,這可能導致顯示錯誤。

要避免這個錯誤,盡量使用三角形,因為三角形都是凸多邊形。

一、指定點

opengl提供的指定點的函數格式:glVertex+1個數字+1~2字母,如

glVertex2d    glVertex2f    glVertex3f   glVertex3fv

其中數字代表參數的個數

字母表示參數類型:

          s     16位整數       GLshort

          i       32位整數      GLint和GLsizei

          f       32位浮點數  GLfloat和GLclampf

         d       64位浮點數  GLdouble和GLclampd

         v        傳遞的參數為指標

如下面的5個程式碼片段功能相同

(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f);
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
             glVertex3fv(VertexArr3);

二、開始繪製

glBegin(GL_POINTS);

     glVertex2f(0.0f, 0.0f);

     glVertex2f(0.5f, 0.0f);

glEnd();

上述GL_POINTS指示將畫兩個點,如果換成GL_LINES則會用兩點畫成一條線,當然

還可以換成還有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,

GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每種方式的大致效果見:

下面是幾個執行個體

畫圓

#include<gl/glut.h>#include<math.h>const int     n  = 20;const GLfloat R  = 0.5f;const GLfloat Pi = 3.1415926536f;// 採用畫正n邊形法畫圓,效率較低void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POLYGON);for (int i=0; i<n; i++)glVertex2f(R*cos(2*Pi*i/n), R*sin(2*Pi*i/n));glEnd();glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv);   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("畫圓");glutDisplayFunc(myDisplay);glutMainLoop();return 0;}

畫五角星

#include<gl/glut.h>#include<math.h>const GLfloat Pi = 3.1415926536f;// 畫五角星// 座標原點在正五邊形的中心void myDisplay(void){GLfloat a = 0.5;    // 座標原點到A點距離(按opengl的距離意義)GLfloat bx =   a * cos(18 * Pi / 180);GLfloat by =   a * sin(18 * Pi / 180);GLfloat cx =   a * cos(54 * Pi / 180);GLfloat cy = - a * sin(54 * Pi / 180);GLfloat PointA[2] = {0, a};GLfloat PointB[2] = {bx, by};GLfloat PointC[2] = {cx, cy};GLfloat PointD[2] = {-cx, cy};GLfloat PointE[2] = {-bx, by};glClear(GL_COLOR_BUFFER_BIT);// A -> C -> E -> B -> D -> AglBegin(GL_LINE_LOOP);glVertex2fv(PointA);glVertex2fv(PointC);glVertex2fv(PointE);glVertex2fv(PointB);glVertex2fv(PointD);glEnd();glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv);   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("畫五角星");glutDisplayFunc(myDisplay);glutMainLoop();return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.