首先
在开始之前,先说一下:如何在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;
}