常用函数使用:
glClear、glColor4f、glClearColor:传送门
glBegin:传送门
glVertex:传送门
glutInit:传送门
glutInitDisplayMode:传送门
glutInitWindowPosition:传送门
glutDisplayFunc:传送门
glutReshapeFunc、glViewport:传送门
回调函数:传送门
实验:
绘制外圆内方的图形。即正方形套圆形嵌套。
为了增强互动性,用鼠标的回调函数实现点一下左键嵌套一层。
代码实现:
#include <bits/stdc++.h>
#include <GL/glut.h>
const int circle_polygon = 3600;
double get_rand() {
return ((double) (rand() % 100)) / 100.0;
}
void print_circle(double r) {
// glClear(GL_COLOR_BUFFER_BIT);
// glClearColor(0, 0, 0, 0);
glColor4f(1.0, 1.0, 1.0, 0);
glBegin(GL_POINTS);
for (int Case = 0; Case < circle_polygon; ++Case) {
glVertex2f(r * cos(2.0 * M_PI * Case / circle_polygon),
r * sin(2.0 * M_PI * Case / circle_polygon));
}
glEnd();
glFlush();
}
void print_square(double r) {
// glClear(GL_COLOR_BUFFER_BIT);
// glClearColor(0, 0, 0, 0);
glColor4f(1, 1, 0, 0);
glBegin(GL_LINES);
glVertex2f(r * cos(M_PI * 0.0 / 180), r * sin(M_PI * 0.0 / 180));
glVertex2f(r * cos(M_PI * 90.0 / 180), r * sin(M_PI * 90.0 / 180));
glVertex2f(r * cos(M_PI * 90.0 / 180), r * sin(M_PI * 90.0 / 180));
glVertex2f(r * cos(M_PI * 180.0 / 180), r * sin(M_PI * 180.0 / 180));
glVertex2f(r * cos(M_PI * 180.0 / 180), r * sin(M_PI * 180.0 / 180));
glVertex2f(r * cos(M_PI * 270.0 / 180), r * sin(M_PI * 270.0 / 180));
glVertex2f(r * cos(M_PI * 270.0 / 180), r * sin(M_PI * 270.0 / 180));
glVertex2f(r * cos(M_PI * 360.0 / 180), r * sin(M_PI * 360.0 / 180));
glEnd();
glFlush();
}
double r, x;
int Case;
void print(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
++Case;
if (Case % 2 == 0)print_square(r);
else {
print_circle(r);
r *= sqrt(2.0);
}
}
}
void print(int w, int h) {
glViewport(0, 0, w, h);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
double r = x;
for (int j = 1; j <= Case; ++j) {
if (j % 2 == 0)print_square(r);
else {
print_circle(r);
r *= sqrt(2.0);
}
}
}
int main(int argc, char *argv[]) {
// srand(time(0));
std::cin >> x;
r = x;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(1000, 1000);
glutCreateWindow("circle");
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
glutMouseFunc(&print);
glutReshapeFunc(&print);
glutMainLoop();
return 0;
}