使用C++ OpenGL,完成Konx 雪花繪圖

2020-10-15 13:00:46

首先

在開始之前,先說一下:如何在Viual Studio (我用的2019)中C++專案中安裝OpenGl外掛

 

點選安裝即可,全程設定不到20s

使用c++ OpenGL,完成Konx 雪花繪圖

#include <GL/glut.h>
#include <stdio.h>
#include <cmath>
#define N 3//遞迴次數
#define C 0.017453//計算cosX角度的一個係數而已
typedef float point[2];
point vertex[3] = { {-0.5,-0.43},{0.5,-0.43},{0,0.43} };//分別是左、右、上
float theta = 0;//初始角度

void draw_line(point p1, point p2)
{
    glBegin(GL_LINES);
    glVertex2fv(p1);
    glVertex2fv(p2);
    glEnd();
}
//遞迴,一分為三,並且確定三點座標
void divide_line(point firstPoint, point secondPoint, int n, float theta)//theta就是數學角度那個希臘字母ceiTa
{
    if (n > 0)
    {
        point p[3];//宣告 新冒出來的三角形的三個點
        float length_X, length_Y, length;
        length_X = secondPoint[0] - firstPoint[0];//
        length_Y = secondPoint[1] - firstPoint[1];
        length = sqrt(length_X * length_X + length_Y * length_Y) / 3;//每次迭代更新三角形邊長(因為越來越小嘛)
       
        //確定新三角形的兩個底面頂點座標
        p[0][0] = firstPoint[0] + length_X / 3;
        p[0][1] = firstPoint[1] + length_Y / 3;
        p[2][0] = secondPoint[0] - length_X / 3;
        p[2][1] = secondPoint[1] - length_Y / 3;
        //確定新三角形的頂點座標,就是那個新冒出來的尖兒
        p[1][0] = p[0][0] + length * cos((theta - 60.0) * C);
        p[1][1] = p[0][1] + length * sin((theta - 60.0) * C);

        divide_line(firstPoint, p[0], n - 1, theta);
        divide_line(p[0], p[1], n - 1, theta - 60);
        divide_line(p[1], p[2], n - 1, theta + 60);
        divide_line(p[2], secondPoint, n - 1, theta);
    }
    else
        //printf("測試,出現了一次n < 0\n");
        draw_line(firstPoint, secondPoint);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    //三條線分別遞迴
    //分別測試,注意角度是120,不是60,之前引數寫的60導致上面兩個邊向三角形內部迭代,而不是外部

    divide_line(vertex[0], vertex[1], N, theta);//底邊
    divide_line(vertex[1], vertex[2], N, theta + 120);//右邊
    divide_line(vertex[2], vertex[0], N, theta - 120);//左邊
    glFlush();
}
void myinit()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glColor3f(1.0, 0, 0);
}


//程式入口
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    //建立視窗,設定尺寸
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);

    glutCreateWindow("Koch 雪花");
    glutDisplayFunc(display);
    myinit();
    glutMainLoop();
    return 0;
}