实验二 多边形逼近画圆

举报
yd_270702662 发表于 2025/09/20 17:29:59 2025/09/20
【摘要】 #include <unistd.h>#include <GL/glut.h>#include <math.h>#include <stdio.h>#include <GL/freeglut.h>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgpro...
#include <unistd.h>
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <GL/freeglut.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

const int n = 60;
const GLfloat r = 0.5f;
const GLfloat Pi = 3.1415926f;
void saveImage();   //保存图形函数,请勿删除


void MyDisplay(void)
{
    //请阅读左侧相关知识画圆步骤,再开始在下方填写代码。
    //=======begin=======
    // 设置清除颜色为白色
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    // 清除屏幕
    glClear(GL_COLOR_BUFFER_BIT);
    // 设置绘制颜色为蓝色
    glColor3f(0.0f, 0.0f, 1.0f);
    // 开始绘制多边形
    glBegin(GL_POLYGON);
    // 生成多边形的顶点
    for(int i = 0; i < n; ++i)
    {
        GLfloat x = r * cos(2 * Pi * i / n);
        GLfloat y = r * sin(2 * Pi * i / n);
        glVertex2f(x, y);
    }

   



    //========end========
    // 结束当前的绘制命令
    glEnd();
    // 将OpenGL命令缓冲区的内容输出到显示器上
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("Circle");
    glutDisplayFunc(&MyDisplay);
    glutCloseFunc(saveImage);// 设置窗口关闭的回调函数
    glutMainLoop();
    return 0;
}

//---------------------------------------------------------------------------
//以下代码请勿删除,为图片保存代码
//将窗口信息保存为图片
void saveImage() {
    // 设置OpenGL视口和投影矩阵
    int saveWidth, saveHeight;

    saveWidth = 400;
    saveHeight = 400;

    glViewport(0, 0, saveWidth, saveHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 400, 0, 400, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
   
    // 创建OpenCV Mat对象并读取窗口像素数据
    cv::Mat image(saveHeight, saveWidth, CV_8UC3);
    glReadPixels(0, 0, saveWidth, saveHeight, GL_BGR, GL_UNSIGNED_BYTE, image.data);
   
    // 翻转图像(因为OpenGL坐标和图片坐标的差异)
    cv::flip(image, image, 0);
   
    // 保存图像
    cv::imwrite("/data/workspace/myshixun/step1/test.png", image);
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。