OpenGL 学习(一)

常用函数使用:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值