VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)

代码和样式引用:

https://blog.csdn.net/Leonis_v/article/details/44902411?spm=1001.2014.3001.5506

首先复制代码:

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;

//screenPt:定义 屏幕上的一个点。
struct screenPt
{
    GLint x;
    GLint y;
};

//curveName:要画的曲线的名称,1-蜗型线,2-心形线,3-三叶曲线,4-四叶曲线,5-螺旋线。
typedef enum{ limacon = 1, cardioid, threeLeaf, fourLeaf, spiral } curveName;

GLsizei winWidth = 600, winHeight = 500;

//init
//init:初始化屏幕。
void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 1.0);//设置显示窗口的背景维白色。
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}

//lineSegment:画出pt1和pt2之间的直线。
void lineSegment(screenPt pt1, screenPt pt2)
{
    glBegin(GL_LINES);
        glVertex2i(pt1.x, pt1.y);
        glVertex2i(pt2.x, pt2.y);
    glEnd();

}

//drawCurve:根据curveNum的值画出对应曲线。
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]是逼近折线的起始位置。
    //默认值是:(x0,y0)。
    curvePt[0].x = x0;
    curvePt[0].y = y0;

    switch(curveNum)
    {//计算开始逼近折线的起始位置,即theta为0时的曲线上点的x值。
        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(3 * theta) ; break;
            case fourLeaf:r = a * cos(2 * theta); break;
            case spiral: r = (a / 20.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;
    }
}

//displayFcn:显示选项,根据提示选择要显示的曲线。

void displayFcn(void)
{
    GLint curveNum;

    glClear(GL_COLOR_BUFFER_BIT);

    cout << "\nEnter the integer value corresponding to\n";
    cout << "one of the following curve names.\n";
    cout << "Press any other key to exit.\n";
    cout << "\n1-limacon, 2-cardioid, 3-threeLeaf, 4-fourLeaf, 5-spiral:";
    cin >> curveNum;

    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);
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);//初始化GLUT。
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置显示模式,使用单缓存和RGB颜色模型。
    glutInitWindowPosition(100, 100);//设置窗口位置。
    glutInitWindowSize(winWidth, winHeight);//设置窗口大小。
    glutCreateWindow("Draw Curves");//创造窗口。

    init();//执行初始化程序。
    glutDisplayFunc(displayFcn);//将图形信息送往窗口显示。
    glutReshapeFunc(winReshapeFcn);//重定义窗口参数。
    glutMainLoop();//循环执行。
}

删除第一行,并根据 glut.h 存放情况选择是否删除 gl/

 选择自己想要的那个曲线:以第一个蜗型线为例

首先修改这个,注意,如果用其他的,要赋值 = 1,这里是第一个蜗型线,所以删除其他的

 

其次,删除其他可选项(单个的可以直接删除switch筛选)

VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)_第1张图片 

 VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)_第2张图片

这里是输出的话可以改为:

 cout << "-------------------------------------------------------\n";
    cout << "\n请输入下列数字\n";
    cout << "选择你想要绘制的样式\n";
    cout << "输入其他数字则退出\n";
    cout << "\n 1 - Trilobal rose curve, 2 - Four leaf rose curve :";

VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)_第3张图片 最后,修改判断(有几个留几个)

VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)_第4张图片

 最终代码(蜗型线)

#include
#include
#include
#include
using namespace std;

//screenPt:定义 屏幕上的一个点。
struct screenPt
{
    GLint x;
    GLint y;
};

//curveName:要画的曲线的名称,1-蜗型线
typedef enum { limacon = 1 } curveName;

GLsizei winWidth = 600, winHeight = 500;

//init
//init:初始化屏幕。
void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 1.0);//设置显示窗口的背景维白色。
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}

//lineSegment:画出pt1和pt2之间的直线。
void lineSegment(screenPt pt1, screenPt pt2)
{
    glBegin(GL_LINES);
    glVertex2i(pt1.x, pt1.y);
    glVertex2i(pt2.x, pt2.y);
    glEnd();

}

//drawCurve:根据curveNum的值画出对应曲线。
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]是逼近折线的起始位置。
    //默认值是:(x0,y0)。
    curvePt[0].x = x0;
    curvePt[0].y = y0;

    switch (curveNum)
    {//计算开始逼近折线的起始位置,即theta为0时的曲线上点的x值。
    case limacon: curvePt[0].x += a + b; break;
    
    default: break;
    }

    theta = dtheta;
    while (theta < twoPi)
    {
        switch (curveNum)
        {
        case limacon: r = a * cos(theta) + b; 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;
    }
}

//displayFcn:显示选项,根据提示选择要显示的曲线。

void displayFcn(void)
{
    GLint curveNum;

    glClear(GL_COLOR_BUFFER_BIT);

    cout << "\n----------------------------\n";
    cout << "\n请输入数字1,显示蜗型线:\n";
    cin >> curveNum;

    if (curveNum == 1 )
    {
        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);
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);//初始化GLUT。
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置显示模式,使用单缓存和RGB颜色模型。
    glutInitWindowPosition(100, 100);//设置窗口位置。
    glutInitWindowSize(winWidth, winHeight);//设置窗口大小。
    glutCreateWindow("Draw Curves");//创造窗口。

    init();//执行初始化程序。
    glutDisplayFunc(displayFcn);//将图形信息送往窗口显示。
    glutReshapeFunc(winReshapeFcn);//重定义窗口参数。
    glutMainLoop();//循环执行。
}

 输入1

VS与OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线(内附修改教程)_第5张图片

成功!

总结 

        多个曲线的程序,若单个可以删除掉两个函数,这里就不展示了,不想循环可以删除while试一下。

你可能感兴趣的:(计算机图形学,c++,visual,studio)