• 计算机图形学实验——利用OpenGL函数绘制五角星


    一、实验名称:五角星的绘制
    二、实验目的:了解 OpenGL 程序设计结构,掌握编程环
    三、境的设置,掌握绘制线段的方法。
    四、实验内容:
    1.在 VC++ 环境下 ,练习利用 OpenGL 绘制三角形的程序。
    2.编程实现绘制一个五角星。(传统 OpenGL 或者 Shader)

    五、实验所需基本函数

    1.线段绘制

    glBegin(GL_LINES);//绘制参数GL_LINES
    glVertex2f(30,30);//起始点坐标
    glVertex2f(100,100);//终点坐标(两个为一组)
    glEnd();

    2.填充图像

        glBegin(GL_POLYGON);//绘制参数GL_POLYGON
        glVertex2f(x0, y0);//顶点坐标1
        glVertex2f(x1, y1);//2
        glVertex2f(cx, cy);//3
        glEnd();

    结果为对三个顶点组成的图像进行填充

    3.绘制颜色设置

    glColor3f(0.92, 0.89, 0.41);//金黄色

    六、实验原理

    根据小圆半径加角度算出第一个坐标 然后大圆根据半径加一个角度算出第二个点坐标,然后旋转改变角度寻找所有顶点。

    代码如下:

     1 void DrawStar(float cx, float cy, float R,float r,float o)//五角星中心坐标x,y,大圆半径,小圆半径,初始角度
     2 {
     3 
     4     float x0, y0, x1, y1;//
     5 float    o0 = o;//大圆对应角度
     6 float    o1 = o + 0.2 * 3.14;//小圆对应角度
     7 for (int i = 0;i <10;i++)
     8 {
     9     x0 = cx+R * cos(o0);//大圆对应的x坐标
    10     y0 = cy+R * sin(o0);//大圆对应y坐标
    11     x1 = cx+r * cos(o1);//小圆对应x坐标
    12     y1 = cy+r * sin(o1);//小圆对应y坐标
    13     if (i % 2 == 0)
    14     {
    15 glColor3f(1, 0, 0);
    16     }
    17     else
    18     {
    19         glColor3f(0.92, 0.89, 0.41);
    20     }
    21     
    22     glBegin(GL_POLYGON);//绘制
    23     glVertex2f(x0, y0);
    24     glVertex2f(x1, y1);
    25     glVertex2f(cx, cy);
    26     glEnd();
    27     if (i % 2 == 0)
    28     {
    29         o0 = o0 + 0.4 * 3.14;//大圆对应角度变换
    30     }
    31     else
    32     {
    33         o1 = o1 + 0.4 * 3.14;//小圆对应角度变换
    34     }
    35 
    36 }
    37 
    38 
    39 
    40 }

     七、绘制结果

    八、附件

    所有代码

     1 // OpenGLOld.cpp : 定义控制台应用程序的入口点。
     2 //
     3 #include <GL/glew.h>//OpenGL库
     4 #include <GL/glut.h>//OpenGL辅助库
     5 #include <math.h>
     6 #pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"" ) //这句是不让控制台窗体出现,如果想要出现,去掉即可。
     7 
     8 void init(void)
     9 {
    10     glClearColor(1.0, 1.0, 1.0, 1.0);//设置背景色白色
    11 }
    12 void DrawStar(float cx, float cy, float R,float r,float o)//五角星中心坐标x,y,大圆半径,小圆半径,初始角度
    13 {
    14 
    15     float x0, y0, x1, y1;//
    16 float    o0 = o;//大圆对应角度
    17 float    o1 = o + 0.2 * 3.14;//小圆对应角度
    18 for (int i = 0;i <10;i++)
    19 {
    20     x0 = cx+R * cos(o0);//大圆对应的x坐标
    21     y0 = cy+R * sin(o0);//大圆对应y坐标
    22     x1 = cx+r * cos(o1);//小圆对应x坐标
    23     y1 = cy+r * sin(o1);//小圆对应y坐标
    24     if (i % 2 == 0)
    25     {
    26 glColor3f(1, 0, 0);
    27     }
    28     else
    29     {
    30         glColor3f(0.92, 0.89, 0.41);
    31     }
    32     
    33     glBegin(GL_POLYGON);//绘制
    34     glVertex2f(x0, y0);
    35     glVertex2f(x1, y1);
    36     glVertex2f(cx, cy);
    37     glEnd();
    38     if (i % 2 == 0)
    39     {
    40         o0 = o0 + 0.4 * 3.14;//大圆对应角度变换
    41     }
    42     else
    43     {
    44         o1 = o1 + 0.4 * 3.14;//小圆对应角度变换
    45     }
    46 
    47 }
    48 
    49 
    50 
    51 }
    52 void display(void)
    53 {
    54     glClear(GL_COLOR_BUFFER_BIT);//清除帧缓存
    55 
    56     DrawStar(300, 300, 120, 50, 0.1*3.14);
    57 
    58     //glFlush();//单缓冲时必须要,说明绘图命令(函数)结束
    59     glutSwapBuffers();//交换缓冲(双缓冲时使用)
    60 }
    61 
    62 void reshape(int width, int height)
    63 {
    64     glViewport(0, 0, width, height);//设置视区(窗口内绘图区域)
    65 
    66     glMatrixMode(GL_PROJECTION);
    67     glLoadIdentity();
    68     gluOrtho2D(0, width, 0, height);//设置图形数据范围
    69     glMatrixMode(GL_MODELVIEW);
    70     glLoadIdentity();
    71 }
    72 
    73 void keyboard(unsigned char key, int x, int y)
    74 {
    75 }
    76 
    77 int main(int argc, char* argv[])
    78 {
    79     glutInitWindowPosition(200, 200);//应用程序窗口位置
    80     glutInitWindowSize(800, 600);//窗口大小
    81     
    82     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//双缓冲,单缓冲为GLUT_SINGLE
    83     glutCreateWindow("五角星绘制");//创建窗口,参数为窗口标题
    84     init();
    85 
    86     glutDisplayFunc(display);//图形绘制
    87     glutReshapeFunc(reshape);//窗口大小变化
    88     glutKeyboardFunc(keyboard);//键盘交互
    89 
    90     glutMainLoop();//必须,进入GLUT事件处理循环
    91 
    92     return 0;
    93 }
    所有代码

  • 相关阅读:
    dynamics crm 2011升级过程中发现的一些问题
    报价单上的“创建订单”按钮Disabled
    C/C++ Qt TableDelegate 自定义代理组件
    C/C++ Qt TabWidget 实现多窗体创建
    C/C++ Qt MdiArea 多窗体组件应用
    C/C++ Qt Tree与Tab组件实现分页菜单
    C/C++ Qt ListWidget 增加右键菜单
    C/C++ Qt StatusBar 底部状态栏应用
    C/C++ Qt TableWidget 表格组件应用
    VS2012 + Qt 4.8.3 + OpenSSL
  • 原文地址:https://www.cnblogs.com/shdwin/p/12512861.html
Copyright © 2020-2023  润新知