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

📄 shapes.c

📁 计算机图形学~想必是很多人需要的~在此共享一下
💻 C
📖 第 1 页 / 共 4 页
字号:
    glLoadIdentity();    gluOrtho2D(0, width, height, 0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();    glClearColor(0.0, 0.0, 0.0, 0.0);}

void 
command_draw_color(GLuint ypos) {
    drawstr(20, ypos, "glColor3f   (");
    drawstr(170, ypos, ",");
    drawstr(230, ypos, ","); 
    drawstr(290, ypos, ");");
}

void 
command_draw_vertex(GLuint ypos) {
    drawstr(20, ypos, "glVertex2f (");
    drawstr(170, ypos, ",");
    drawstr(230, ypos, ");"); 
}void command_display(void){
    int i;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        glColor3ub(255, 255, 255);    setfont("helvetica", 18);
    
    drawstr(20, 30, "glBegin (");
    
    if (mode == GL_LINES)
        drawstr(95, 30, "GL_LINES);");
    else if (mode == GL_LINE_LOOP)
        drawstr(95, 30, "GL_LINE_LOOP);");
    else if (mode == GL_LINE_STRIP)
        drawstr(95, 30, "GL_LINE_STRIP);");
    else if (mode == GL_TRIANGLES)
        drawstr(95, 30, "GL_TRIANGLES);");
    else if (mode == GL_TRIANGLE_FAN)
        drawstr(95, 30, "GL_TRIANGLE_FAN);");
    else if (mode == GL_TRIANGLE_STRIP)
        drawstr(95, 30, "GL_TRIANGLE_STRIP);");
    else if (mode == GL_QUADS)
        drawstr(95, 30, "GL_QUADS);");
    else if (mode == GL_QUAD_STRIP)
        drawstr(95, 30, "GL_QUAD_STRIP);");
    else if (mode == GL_POLYGON)
        drawstr(95, 30, "GL_POLYGON);");
    else if (mode == GL_POINTS)
        drawstr(95, 30, "GL_POINTS);");
    
    if ((mode == GL_LINES) && !shaded ) {
        command_draw_color(lines[0].y);
        command_draw_vertex(lines[3].y);
        command_draw_vertex(lines[5].y);        command_draw_color(lines[7].y);
        command_draw_vertex(lines[10].y);
        command_draw_vertex(lines[12].y);
        drawstr(20, lines[12].y + 30, "glEnd();");        
        for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++) {            cell_draw(&lines[i]);
        }
    }
    else if ((mode == GL_TRIANGLE_FAN) || (mode == GL_TRIANGLE_STRIP) || 
        (shaded && 
        ((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
        (mode == GL_LINE_STRIP) || (mode == GL_QUADS)))) {
        
        command_draw_color(shadeFour[0].y);
        command_draw_vertex(shadeFour[3].y);
        command_draw_color(shadeFour[5].y);
        command_draw_vertex(shadeFour[8].y);
        command_draw_color(shadeFour[10].y);
        command_draw_vertex(shadeFour[13].y);
        command_draw_color(shadeFour[15].y);
        command_draw_vertex(shadeFour[18].y);
        drawstr(20, shadeFour[18].y + 30, "glEnd();");
        
        if (mode == GL_TRIANGLE_STRIP) {
            for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++) 
                cell_draw(&tStrip[i]);
        }
        else if (mode == GL_TRIANGLE_FAN) {
            for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++) 
                cell_draw(&tFan[i]);
        }
        else if (mode == GL_QUADS) {
            for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++) 
                cell_draw(&shadeQuad[i]);
        }
        else {
            for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++) 
                cell_draw(&shadeFour[i]);
        }
    } 
    else if (!shaded && 
        ((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) || 
        (mode == GL_QUADS))) {
        command_draw_color(flatFour[0].y);
        command_draw_vertex(flatFour[3].y);
        command_draw_vertex(flatFour[5].y);
        command_draw_vertex(flatFour[7].y);
        command_draw_vertex(flatFour[9].y);
        drawstr(20, flatFour[9].y + 30, "glEnd();");
        
        if (mode == GL_QUADS) {
            for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++) 
                cell_draw(&flatQuad[i]);
        }
        else {
            for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++) 
                cell_draw(&flatFour[i]);
        }
    } 
    else if (shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        command_draw_color(shadeThree[0].y);
        command_draw_vertex(shadeThree[3].y);
        command_draw_color(shadeThree[5].y);
        command_draw_vertex(shadeThree[8].y);
        command_draw_color(shadeThree[10].y);
        command_draw_vertex(shadeThree[13].y);
        drawstr(20, shadeThree[13].y + 30, "glEnd();");
        
        for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++) {
            cell_draw(&shadeThree[i]);
        }
    } 
    else if (!shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        command_draw_color(flatThree[0].y);
        command_draw_vertex(flatThree[3].y);
        command_draw_vertex(flatThree[5].y);
        command_draw_vertex(flatThree[7].y);
        drawstr(20, flatThree[7].y + 30, "glEnd();");
        
        for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++) {
            cell_draw(&flatThree[i]);
        }
    } 
    else if (mode == GL_QUAD_STRIP) {
        command_draw_color(shadeQStrip[0].y);
        command_draw_vertex(shadeQStrip[3].y);
        command_draw_color(shadeQStrip[5].y);
        command_draw_vertex(shadeQStrip[8].y);
        command_draw_color(shadeQStrip[10].y);
        command_draw_vertex(shadeQStrip[13].y);
        command_draw_color(shadeQStrip[15].y);
        command_draw_vertex(shadeQStrip[18].y);
        command_draw_color(shadeQStrip[20].y);
        command_draw_vertex(shadeQStrip[23].y);
        command_draw_color(shadeQStrip[25].y);
        command_draw_vertex(shadeQStrip[28].y);
        drawstr(20, shadeQStrip[28].y + 30, "glEnd();");
        
        for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++) {
            cell_draw(&shadeQStrip[i]);
        }
    } 
    else if ((mode == GL_POINTS)) {
        command_draw_color(shadePoints[0].y);
        command_draw_vertex(shadePoints[3].y);
        command_draw_color(shadePoints[5].y);
        command_draw_vertex(shadePoints[8].y);
        command_draw_color(shadePoints[10].y);
        command_draw_vertex(shadePoints[13].y);
        command_draw_color(shadePoints[15].y);
        command_draw_vertex(shadePoints[18].y);
        command_draw_color(shadePoints[20].y);
        command_draw_vertex(shadePoints[23].y);
        command_draw_color(shadePoints[25].y);
        command_draw_vertex(shadePoints[28].y);
        drawstr(20, shadePoints[28].y + 30, "glEnd();");
        
        for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++) {
            cell_draw(&shadePoints[i]);
        }
    } 
    
    if (!selection) {        glColor3ub(255, 255, 0);        drawstr(10, MESSAGEY, "Click on the arguments and");
        drawstr(10, MESSAGEY+30, "move the mouse to modify values.");    }           glutSwapBuffers();}int old_y;voidcommand_mouse(int button, int state, int x, int y){
    int i;    selection = 0;        if (state == GLUT_DOWN) {    /* mouse should only hit _one_ of the cells, so adding up all        the hits just propagates a single hit. */
        
        if ((mode == GL_LINES) && !shaded ) {
            for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)                selection += cell_hit(&lines[i], x, y);
        }
        else if ((shaded && 
            ((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
            (mode == GL_LINE_STRIP)))) {
            
            for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
                selection += cell_hit(&shadeFour[i], x, y);
        }
        else if (!shaded && 
            ((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
            for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
                selection += cell_hit(&flatFour[i], x, y);
        }
        else if (shaded && (mode == GL_QUADS)) {
            for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
                selection += cell_hit(&shadeQuad[i], x, y);
        }
        else if (!shaded && (mode == GL_QUADS)) {
            for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
                selection += cell_hit(&flatQuad[i], x, y);
        }
        else if (mode == GL_TRIANGLE_FAN) {
            for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
                selection += cell_hit(&tFan[i], x, y);
        }
        else if (mode == GL_TRIANGLE_STRIP) {
            for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
                selection += cell_hit(&tStrip[i], x, y);
        }
        else if (shaded && 
            ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
            for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
                selection += cell_hit(&shadeThree[i], x, y);
        }
        else if (!shaded && 
            ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
            for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
                selection += cell_hit(&flatThree[i], x, y);
        }
        else if (mode == GL_QUAD_STRIP) {
            for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
                selection += cell_hit(&shadeQStrip[i], x, y);
        }
        else if (mode == GL_POINTS) {
            for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
                selection += cell_hit(&shadePoints[i], x, y);
        }
    }        old_y = y;        redisplay_all();}voidcommand_motion(int x, int y){
    int i;
    
    if ((mode == GL_LINES) && !shaded ) {
        for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)            cell_update(&lines[i], old_y-y);
    }
    else if (shaded && 
        ((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
        (mode == GL_LINE_STRIP))) {
        for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
            cell_update(&shadeFour[i], old_y-y);
    }
    else if (mode == GL_TRIANGLE_STRIP) {
        for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
            cell_update(&tStrip[i], old_y-y);
    }
    else if (mode == GL_TRIANGLE_FAN) {
        for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
            cell_update(&tFan[i], old_y-y);
    }
    else if (shaded && (mode == GL_QUADS)) {
        for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
            cell_update(&shadeQuad[i], old_y-y);
    }
    else if (!shaded && (mode == GL_QUADS)) {
        for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
            cell_update(&flatQuad[i], old_y-y);
    }
    else if (!shaded && 
        ((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
        for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
            cell_update(&flatFour[i], old_y-y);
    }
    else if (shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
            cell_update(&shadeThree[i], old_y-y);
    }
    else if (!shaded && 
        ((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
        for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
            cell_update(&flatThree[i], old_y-y);
    }
    else if (mode == GL_QUAD_STRIP) {
        for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
            cell_update(&shadeQStrip[i], old_y-y);
    }
    else if (mode == GL_POINTS) {
        for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
            cell_update(&shadePoints[i], old_y-y);
    }
    old_y = y;        redisplay_all();}
void
screen_menu(int value)
{
    main_keyboard((unsigned char)value, 0, 0);
}

voidcommand_menu(int value){    main_keyboard((unsigned char)value, 0, 0);}voidredisplay_all(void){    glutSetWindow(command);    glutPostRedisplay();    glutSetWindow(screen);    screen_reshape(sub_width, sub_height);    glutPostRedisplay();}intmain(int argc, char** argv){    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);    glutInitWindowSize(640+GAP*3, 512+GAP*2);    glutInitWindowPosition(50, 50);    glutInit(&argc, argv);        window = glutCreateWindow("Shapes");    glutReshapeFunc(main_reshape);    glutDisplayFunc(main_display);    glutKeyboardFunc(main_keyboard);        screen = glutCreateSubWindow(window, GAP, GAP, 256, 256);    glutReshapeFunc(screen_reshape);    glutDisplayFunc(screen_display);    glutKeyboardFunc(main_keyboard);    sm = glutCreateMenu(screen_menu);    glutAddMenuEntry("Options", 0);    glutAddMenuEntry("", 0);    glutAddMenuEntry("Toggle big vertices", 'B');    glutAddMenuEntry("Specify colors@vertices", 'C');    glutAddMenuEntry("Toggle drawing outlines", 'O');    glutAttachMenu(GLUT_RIGHT_BUTTON);
    createCircleList ();
        command = glutCreateSubWindow(window, GAP+256+GAP, GAP, 256, 256);    glutReshapeFunc(command_reshape);    glutDisplayFunc(command_display);    glutMotionFunc(command_motion);    glutMouseFunc(command_mouse);    glutKeyboardFunc(main_keyboard);    glutCreateMenu(command_menu);    glutAddMenuEntry("Shapes", 0);    glutAddMenuEntry("", 0);
    glutAddMenuEntry("POINTS [p]  ", 'p');    glutAddMenuEntry("LINES [l]  ", 'l');    glutAddMenuEntry("LINE_LOOP [n]", 'n');    glutAddMenuEntry("LINE_STRIP [y]", 'y');
    glutAddMenuEntry("TRIANGLES [t]", 't');
    glutAddMenuEntry("TRIANGLE_FAN [f]", 'f');
    glutAddMenuEntry("TRIANGLE_STRIP [x]", 'x');
    glutAddMenuEntry("QUADS [q]", 'q');
    glutAddMenuEntry("QUAD_STRIP [u]", 'u');
    glutAddMenuEntry("POLYGON [g]", 'g');    glutAddMenuEntry("Reset parameters [r]", 'r');    glutAddMenuEntry("", 0);    glutAddMenuEntry("Quit", 27);    glutAttachMenu(GLUT_RIGHT_BUTTON);
            redisplay_all();        glutMainLoop();        return 0;}

⌨️ 快捷键说明

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