OpenGL国民党党徽、共青团团徽、花型的绘制

来源:互联网 发布:张大奕的淘宝店劣质 编辑:程序博客网 时间:2024/04/29 19:55
#include<gl/glut.h>#include<math.h>#include<windows.h>#include<algorithm>using namespace std;const double PI = acos(-1.0);#define getColor(a) (a/255.0)int cnt;        //顶点数void drawCircle(float x, float y, float r)      //画圆{    int n = 100;    glBegin(GL_POLYGON);    for (int i = 0; i < n; i++)    {        glVertex2f(r*cos(i * 2 * PI / n)+x, r*sin(i * 2 * PI / n)+y);    }    glEnd();}void graphy1()      //国民党党徽{    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(getColor(14), getColor(0), getColor(140));        //外围大蓝圆    drawCircle(0, 0, 0.7);    glColor3f(1, 1, 1);     //白色多边形    glBegin(GL_TRIANGLE_FAN);    glVertex2f(0, 0);    for (int i = 0; i <= 24; i++)    {        if (i & 1)            glVertex2f(0.4*sin(i * 2 * PI / 24), 0.4*cos(i * 2 * PI / 24));        else            glVertex2f(0.68*sin(i * 2 * PI / 24), 0.68*cos(i * 2 * PI / 24));    }    glEnd();    glColor3f(getColor(14), getColor(0), getColor(140));        //蓝色圆    drawCircle(0, 0, 0.36);    glColor3f(1, 1, 1);     //白色圆    drawCircle(0, 0, 0.32);    glFlush();}void graphy2()      //共青团团徽{    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(1, 1, 0);     //外围黄色圆    drawCircle(0, 0, 0.7);    glColor3f(1, 0, 0);     //红色圆    drawCircle(0, 0, 0.65);    glColor3f(1, 1, 0);     //五角星(填充)    glBegin(GL_TRIANGLE_FAN);    glVertex2f(0, 0);    for (int i = 0; i <= 10; i++)    {        if (i&1)            glVertex2f(0.25*sin(i * 2 * PI / 10), 0.25*cos(i * 2 * PI / 10));        else            glVertex2f(0.65*sin(i * 2 * PI / 10), 0.65*cos(i * 2 * PI / 10));    }    glEnd();    glColor3f(0, 0, 0);     //五角星轮廓    for (int i = 0; i <= 10; i++)    {        float p1_x, p1_y, p2_x, p2_y;        if (i & 1)        {            p1_x = 0.25*sin(i * 2 * PI / 10);            p1_y = 0.25*cos(i * 2 * PI / 10);            p2_x = 0.65*sin((i + 1) * 2 * PI / 10);            p2_y = 0.65*cos((i + 1) * 2 * PI / 10);        }        else        {            p1_x = 0.65*sin(i * 2 * PI / 10);            p1_y = 0.65*cos(i * 2 * PI / 10);            p2_x = 0.25*sin((i+1) * 2 * PI / 10);            p2_y = 0.25*cos((i+1) * 2 * PI / 10);        }        glBegin(GL_LINES);        glVertex2f(0, 0); glVertex2f(p1_x, p1_y);        glVertex2f(0, 0); glVertex2f(p2_x, p2_y);        glVertex2f(p1_x, p1_y); glVertex2f(p2_x, p2_y);        glEnd();    }    glFlush();}void graphy3()      //多边形{    glClear(GL_COLOR_BUFFER_BIT);    const float r = 0.7;    const float hr = r / 2.0;    for (int i = 0; i < cnt; i++)    {        float p1_x, p1_y, p2_x, p2_y, p3_x, p3_y;        p1_x = r*sin(i * 2 * PI / cnt);        p1_y = r*cos(i * 2 * PI / cnt);        p2_x = r*sin((i+1) * 2 * PI / cnt);        p2_y = r*cos((i+1) * 2 * PI / cnt);        p3_x = hr*sin((i<<1|1) * PI / cnt);        p3_y = hr*cos((i<<1|1) * PI / cnt);        glBegin(GL_TRIANGLES);      //填充        glColor3f(1, 0, 1);        glVertex2f(p1_x, p1_y);        glVertex2f(p2_x, p2_y);        glVertex2f(p3_x, p3_y);        glEnd();        glBegin(GL_TRIANGLE_FAN);        glColor3f(1, 1, 1);        glVertex2f(0, 0);        glVertex2f(p1_x, p1_y);        glVertex2f(p3_x, p3_y);        glVertex2f(p2_x, p2_y);        glEnd();        glBegin(GL_LINES);      //边界线条        glColor3f(1, 0, 0);        glVertex2f(0, 0); glVertex2f(p1_x, p1_y);        glVertex2f(0, 0); glVertex2f(p2_x, p2_y);        glColor3f(0, 0, 0);        glVertex2f(0, 0); glVertex2f(p3_x, p3_y);        glVertex2f(p2_x, p2_y); glVertex2f(p1_x, p1_y);        glVertex2f(p3_x, p3_y); glVertex2f(p1_x, p1_y);        glVertex2f(p3_x, p3_y); glVertex2f(p2_x, p2_y);        glEnd();    }    glFlush();}void initWindow(int &argc, char *argv[], int width, int height, char *title)    //初始化并显示到屏幕中央{    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);    glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - width) >> 1, (GetSystemMetrics(SM_CYSCREEN) - height) >> 1);       //指定窗口位置    glutInitWindowSize(width, height);       //指定窗口大小    glutCreateWindow(title);    glClearColor(0.0, 0.0, 0.0, 0.0);    glShadeModel(GL_FLAT);      //设置颜色过渡模式,默认为GL_SMOOTH(渐变)}void welcome(){    puts("\n\t说明:\t图案形式选择1:绘制国民党党徽;");    puts("\t\t图案形式不为1,顶点数输入5;绘制共青团团徽!");    puts("\t\t其余绘制花型图案!");    printf("\n请输入图案形式(1:国民党党徽,其余不为1):");}int main(int argc, char *argv[]){    initWindow(argc, argv, 400, 400, "Test2");    welcome();    int op;    scanf("%d", &op);    if (op == 1)        glutDisplayFunc(&graphy1);     else    {        printf("请输入多边形的顶点数(1<n<100): ");        while (~scanf("%d", &cnt))        {            if (cnt == 5)                glutDisplayFunc(&graphy2);            else if (cnt > 1 && cnt < 100)                glutDisplayFunc(&graphy3);            else            {                printf("您的输入有误,请重新输入:");                continue;            }            break;        }    }    glutMainLoop();    return 0;}

国民党党徽
共青团团徽
多边形