zoukankan      html  css  js  c++  java
  • OpenGL——圆公式相关变化的绘制

    #include<iostream>
    #include <math.h>
    //旧版本 固定管线
    #include<Windows.h>
    #include <GL/glut.h>
    
    using namespace std;
    
    const GLdouble twoPi = 6.283185;
    
    struct screenPt {
        GLint x, y;
    };
    
    typedef enum{ limacon =1, cardioid, threeLeaf, fourLeaf, spiral} curveName;
    
    
    GLsizei winWidth = 600, winHeight = 500;
    
    
    void init()
    {
        //窗口背景为白色
        glClearColor(1, 1, 1, 1);
        glMatrixMode(GL_PROJECTION);
        gluOrtho2D(0.0, 200.0, 0.0, 150.0);
    }
    
    void lineSegment(screenPt pt1, screenPt pt2)
    {
        glBegin(GL_LINES);
        glVertex2i(pt1.x, pt1.y);
        glVertex2i(pt2.x, pt2.y);
        glEnd();
    }
    
    void drawCurve(GLint curveNum)
    {
        const GLdouble twoPi = 6.283185;
        const GLint a = 175, b = 60;
    
        GLfloat r, theta, dtheta = 1.0 / float(a);
        GLint x0 = 200, y0 = 250;
        screenPt curvePt[2];
    
        glColor3f(0.0, 0.0, 0.0);
        curvePt[0].x = x0;
        curvePt[0].y = y0;
    
    
        switch (curveNum) {
        case limacon:
            curvePt[0].x += a + b;
            break;
        case cardioid:
            curvePt[0].x += a + a;
            break;
        case threeLeaf:
            curvePt[0].x += a;
            break;
        case fourLeaf:
            curvePt[0].x += a;
            break;
        case spiral:
            break;
        default:
            break;
        }
    
        theta = dtheta;
    
        while (theta < twoPi) {
            switch (curveNum) {
            case limacon:
                r = a * cos(theta) + b;
                break;
            case cardioid:
                r = a * (1 + cos(theta));
                break;
            case threeLeaf:
                r = a * cos(theta * 3);
                break;
            case fourLeaf:
                r = a * cos(theta * 2);
                break;
            case spiral:
                r = (a / 4.0) * theta;
                break;
            default:
                break;
            }
            curvePt[1].x = x0 + r * cos(theta);
            curvePt[1].y = y0 + r * sin(theta);
            lineSegment(curvePt[0], curvePt[1]);
            
            curvePt[0].x = curvePt[1].x;
            curvePt[0].y = curvePt[1].y;
            theta += dtheta;
        }
    }
    
    
    void displayFcn()
    {    
        GLint curveNum;
    
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(0.0, 0.0, 1.0);
        cout << "选择下列任意图形进行绘制
    ";
        cout << "1-limacon, 2-cardioid, 3-threeLeaf, 4-fourLeaf, 5-spiral
    ";
        
        if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) {
            drawCurve(curveNum);
        }
        else {
            exit(0);
        }
            glFlush();
        
    }
    
    void winReshapeFcn(GLint newWidth, GLint newHeight)
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));
        glClear(GL_COLOR_BUFFER_BIT);
    
        winWidth = newWidth;
        winHeight = newHeight;
    }
    
    int main(int argc, char* argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(winWidth, winHeight);
        glutCreateWindow("Curves");
        init();
       
        glutDisplayFunc(displayFcn);
        glutReshapeFunc(winReshapeFcn);
        glutMainLoop();
    
        system("pause");
        return 0;
    
    
    }
  • 相关阅读:
    Docker 基础 : 数据管理
    linux sudo 命令
    TeamCity : .NET Core 插件
    C# 文件下载之断点续传
    TeamCity : 配置 Build 过程
    TeamCity : Build 版本控制系统配置
    Git : SSH 协议服务器
    TeamCity : Build 基本配置
    C# 文件下载 : WinINet
    [翻译] TSMessages
  • 原文地址:https://www.cnblogs.com/farewell-farewell/p/9403757.html
Copyright © 2011-2022 走看看