⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shapes.c

📁 计算机图形学~想必是很多人需要的~在此共享一下
💻 C
📖 第 1 页 / 共 4 页
字号:
        ((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) || 
        (mode == GL_QUADS))) {
        
        if (mode == GL_QUADS)
            cell_vector (vals, flatQuad, sizeof(flatQuadInit)/sizeof(float));
        else
            cell_vector (vals, flatFour, sizeof(flatFourInit)/sizeof(float));
        if (mode == GL_LINE_LOOP) 
            glBegin (GL_LINE_LOOP);			
        else if (mode == GL_LINE_STRIP) 
            glBegin (GL_LINE_STRIP);
        else if (mode == GL_QUADS) 
            glBegin (GL_QUADS);
        glColor3fv (&vals[0]);
        glVertex2fv (&vals[3]);
        glVertex2fv (&vals[5]);
        glVertex2fv (&vals[7]);
        glVertex2fv (&vals[9]);
        glEnd();
        if (bigVertices) {
            glColor3fv (&vals[0]);
            drawCircle (&vals[3]);
            drawCircle (&vals[5]);
            drawCircle (&vals[7]);
            drawCircle (&vals[9]);
        }
    } 
    else if (shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        cell_vector (vals, shadeThree, sizeof(shadeThreeInit)/sizeof(float));
        if (mode == GL_TRIANGLES) 
            glBegin (GL_TRIANGLES);			
        else if (mode == GL_POLYGON) 
            glBegin (GL_POLYGON);
        glColor3fv (&vals[0]);
        glVertex2fv (&vals[3]);
        glColor3fv (&vals[5]);
        glVertex2fv (&vals[8]);
        glColor3fv (&vals[10]);
        glVertex2fv (&vals[13]);
        glEnd();
        if (bigVertices) {
            glColor3fv (&vals[0]);
            drawCircle (&vals[3]);
            glColor3fv (&vals[5]);
            drawCircle (&vals[8]);
            glColor3fv (&vals[10]);
            drawCircle (&vals[13]);
        }
    }
    else if (!shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        cell_vector (vals, flatThree, sizeof(flatThreeInit)/sizeof(float));
        if (mode == GL_TRIANGLES) 
            glBegin (GL_TRIANGLES);			
        else if (mode == GL_POLYGON) 
            glBegin (GL_POLYGON);
        glColor3fv (&vals[0]);
        glVertex2fv (&vals[3]);
        glVertex2fv (&vals[5]);
        glVertex2fv (&vals[7]);
        glEnd();
        if (bigVertices) {
            glColor3fv (&vals[0]);
            drawCircle (&vals[3]);
            drawCircle (&vals[5]);
            drawCircle (&vals[7]);
        }
    }
    else if ((mode == GL_POINTS) || (mode == GL_QUAD_STRIP)) {
        if (mode == GL_POINTS) {
            cell_vector (vals, shadePoints, sizeof(shadePointsInit)/sizeof(float));
            glBegin (GL_POINTS);	
        }
        else if (mode == GL_QUAD_STRIP) {
            cell_vector (vals, shadeQStrip, sizeof(shadeQStripInit)/sizeof(float));
            glBegin (GL_QUAD_STRIP);
        }
        glColor3fv (&vals[0]);
        glVertex2fv (&vals[3]);
        glColor3fv (&vals[5]);
        glVertex2fv (&vals[8]);
        glColor3fv (&vals[10]);
        glVertex2fv (&vals[13]);
        glColor3fv (&vals[15]);
        glVertex2fv (&vals[18]);
        glColor3fv (&vals[20]);
        glVertex2fv (&vals[23]);
        glColor3fv (&vals[25]);
        glVertex2fv (&vals[28]);
        glEnd();
        if (bigVertices) {
            glColor3fv (&vals[0]);
            drawCircle (&vals[3]);
            glColor3fv (&vals[5]);
            drawCircle (&vals[8]);
            glColor3fv (&vals[10]);
            drawCircle (&vals[13]);
            glColor3fv (&vals[15]);
            drawCircle (&vals[18]);
            glColor3fv (&vals[20]);
            drawCircle (&vals[23]);
            glColor3fv (&vals[25]);
            drawCircle (&vals[28]);
        }
        if (outlined && (mode == GL_QUAD_STRIP)) {
            glLineWidth (3.0);
            glColor3f (1.0f, 1.0f, 1.0f);
            glBegin (GL_LINE_LOOP);
            glVertex2fv (&vals[3]);
            glVertex2fv (&vals[8]);
            glVertex2fv (&vals[18]);
            glVertex2fv (&vals[28]);
            glVertex2fv (&vals[23]);
            glVertex2fv (&vals[13]);
            glEnd();
            glBegin (GL_LINES);
            glVertex2fv (&vals[13]);
            glVertex2fv (&vals[18]);
            glEnd();
            glLineWidth (1.0);
            glColor3f (0.0f, 0.0f, 0.0f);
            glBegin (GL_LINE_LOOP);
            glVertex2fv (&vals[3]);
            glVertex2fv (&vals[8]);
            glVertex2fv (&vals[18]);
            glVertex2fv (&vals[28]);
            glVertex2fv (&vals[23]);
            glVertex2fv (&vals[13]);
            glEnd();
            glBegin (GL_LINES);
            glVertex2fv (&vals[13]);
            glVertex2fv (&vals[18]);
            glEnd();
        }
    }
}

void
drawaxes(void)
{
    glColor3ub(255, 255, 255);
    glLineWidth (2.0);
    glBegin (GL_LINE_STRIP);
    glVertex2i (200, 0);
    glVertex2i (0, 0);
    glVertex2i (0, 200);
    glEnd ();
    glBegin (GL_LINE_STRIP);
    glVertex2i (-5, 195);
    glVertex2i (0, 200);
    glVertex2i (5, 195);
    glEnd ();
    glBegin (GL_LINE_STRIP);
    glVertex2i (195, -5);
    glVertex2i (200, 0);
    glVertex2i (195, 5);
    glEnd ();
    glLineWidth (1.0);
    
    setfont("helvetica", 12);
    drawstr(205, -3, "X");
    drawstr(-5, 205, "Y");
    drawstr(-10, -10, "0");
    drawstr(-27, 195, "200");
    drawstr(186, -16, "200");
}voidmain_reshape(int width,  int height) {    glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluOrtho2D(0, width, height, 0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();    #define GAP  25				/* gap between subwindows */    sub_width = (width-GAP*3)/2.0;    sub_height = (height-GAP*2);        glutSetWindow(screen);    glutPositionWindow(GAP, GAP);    glutReshapeWindow(sub_width, sub_height);
    glutSetWindow(command);    glutPositionWindow(GAP+sub_width+GAP, GAP);    glutReshapeWindow(sub_width, sub_height);}voidmain_display(void){    glClearColor(0.8f, 0.8f, 0.8f, 0.0);    glClear(GL_COLOR_BUFFER_BIT);    glColor3ub(0, 0, 0);    setfont("helvetica", 12);    drawstr(GAP, GAP-5, "Screen-space view");    drawstr(GAP+sub_width+GAP, GAP-5, "Command manipulation window");    glutSwapBuffers();}voidmain_keyboard(unsigned char key, int x, int y){
    int i;
        switch (key) {
    case 'B':
        bigVertices = !bigVertices;
        break;
    case 'C':
        shaded = !shaded;
        break;
    case 'O':
        outlined = !outlined;
        break;
    case 'f':
        mode = GL_TRIANGLE_FAN;
        glutSetWindow(screen);
        glutDestroyMenu (sm);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle drawing outlines", 'O');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;	
    case 'g':
        mode = GL_POLYGON;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;    case 'l':
        mode = GL_LINES;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'n':
        mode = GL_LINE_LOOP;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'p':
        mode = GL_POINTS;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'q':
        mode = GL_QUADS;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'r':
        if (!shaded && (mode == GL_LINES)) {
            for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)
                lines[i].value = linesInit[i];
        }
        else if (shaded && 
            ((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
            (mode == GL_LINE_STRIP))) {
            for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
                shadeFour[i].value = shadeFourInit[i];
        }
        else if (!shaded && 
            (mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP)) {
            for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
                flatFour[i].value = flatFourInit[i];
        }
        else if (shaded && 
            ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
            for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
                shadeThree[i].value = shadeThreeInit[i];
        }
        else if (!shaded && 
            ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
            for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
                flatThree[i].value = flatThreeInit[i];
        }
        else if (mode == GL_TRIANGLE_FAN) {
            for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
                tFan[i].value = tFanInit[i];
        }
        else if (mode == GL_TRIANGLE_STRIP) {
            for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
                tStrip[i].value = tStripInit[i];
        }
        else if (!shaded && (mode == GL_QUADS)) {
            for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
                flatQuad[i].value = flatQuadInit[i];
        }
        else if (shaded && (mode == GL_QUADS)) {
            for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
                shadeQuad[i].value = shadeQuadInit[i];
        }
        else if (mode == GL_QUAD_STRIP) {
            for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++) 
                shadeQStrip[i].value = shadeQStripInit[i];
        }
        else if (mode == GL_POINTS) {
            for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++) 
                shadePoints[i].value = shadePointsInit[i];
        }
        break;
    case 't':
        mode = GL_TRIANGLES;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'u':
        mode = GL_QUAD_STRIP;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle drawing outlines", 'O');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'x':
        mode = GL_TRIANGLE_STRIP;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle drawing outlines", 'O');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;
    case 'y':
        mode = GL_LINE_STRIP;
        glutSetWindow(screen);
        sm = glutCreateMenu(screen_menu);
        glutAddMenuEntry("Options", 0);
        glutAddMenuEntry("", 0);
        glutAddMenuEntry("Toggle big vertices", 'B');
        glutAddMenuEntry("Toggle colors at vertices", 'C');
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        break;    case 27:        exit(0);
    default:
        break;    }        redisplay_all();}voidscreen_reshape(int width, int height){    glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluOrtho2D ((GLdouble) 100-width/2, (GLdouble) 100+width/2, 
        (GLdouble) 100-height/2, (GLdouble) 100+height/2);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}voidscreen_display(void){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    drawaxes();
    drawmodel();    glutSwapBuffers();}voidcommand_reshape(int width, int height){    glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -