首页 > 编程语言 >DEV C++ 平台【openGL】库 几何变换下图案设计 星状图形 与 圆 的画法实现 【C语言】【GL库】【计算机图形学】

DEV C++ 平台【openGL】库 几何变换下图案设计 星状图形 与 圆 的画法实现 【C语言】【GL库】【计算机图形学】

时间:2024-11-02 16:19:31浏览次数:4  
标签:圆心 openGL 星状 图形学 GLfloat 几何变换 图形 include 绘制

 项目实现

话不多说,上干货!

       在本文中,我们将探讨如何使用OpenGL库在DEV C++平台上绘制一个包含星状图形和圆的设计。

功能简单介绍

       该代码通过定义多个函数,实现了圆和星状图形的精确绘制。首先,DrawingCircle函数负责绘制圆,通过指定圆心坐标和半径,利用三角形扇形逼近圆形。接着,DrawElement函数用于绘制星状图形的基本元素,即两个三角形组成的叶片。DrawStar函数则通过几何变换,将基本元素旋转并放置在适当位置,形成一个完整的星状图形。

图形如下

图形代码

#include <windows.h>
#include <GL/glut.h>
#include <cmath>

#define GLUT_DISABLE_ATEXIT_HACK

// 绘制圆的函数,添加了圆心坐标参数和半径 
void DrawingCircle(GLfloat centerX, GLfloat centerY, GLfloat radius) {
    GLint triangleAmount = 100; // 使用的三角形数量
    GLfloat twicePi = 2.0 * 3.14159265358979323846;

    glBegin(GL_TRIANGLE_FAN);
        // 使用新的圆心坐标
        glVertex2f(centerX, centerY); // 圆心
        for(int i = 0; i <= triangleAmount; i++) {
            glVertex2f(
                centerX + radius * cos(i * twicePi / triangleAmount), 
                centerY + radius * sin(i * twicePi / triangleAmount)
            );
        }
    glEnd();
}

// 绘制内部星状结构基本元素的函数
// k —叶片宽度占整个半径的比例
void DrawElement(GLfloat Xo, GLfloat Yo, GLfloat R, GLfloat k=0.25) {
    
	//由两个三角形组成  
	glBegin(GL_TRIANGLES);
        // 第一个三角形(下侧)
        glColor3f(1.0, 1.0, 1.0);
		glVertex2f(Xo, Yo); // 叶片中心点
        glVertex2f(Xo + R, Yo); // 右角
        glVertex2f(Xo +k*R , Yo - k*R); // 左下角
	glEnd() ;
	glBegin(GL_TRIANGLES);
        // 第二个三角形(上侧)
        glColor3f(0.0, 0.0, 0.0);
		glVertex2f(Xo, Yo); // 叶片中心点
        glVertex2f(Xo + R, Yo); // 右角
        glVertex2f(Xo +k*R , Yo + k*R); // 左上角
    glEnd();
}

// 绘制基本元素几何变换及数量的函数
void DrawStar(GLfloat Xo, GLfloat Yo, GLfloat R, GLfloat k, int elementNum = 4) {
    float angleStep = 360.0 / elementNum;

    for (int i = 0; i < elementNum; ++i) {
        glPushMatrix();// 保存当前矩阵状态
	        glTranslatef(Xo, Yo, 0.0);	// 移动至当前叶片的位置
	        glRotatef(i * angleStep, 0.0, 0.0, 1.0);	//旋转相应角度 
	        glTranslatef(-Xo, -Yo, 0.0);	//移动到原点 
	        DrawElement(Xo, Yo, R, k);	// 绘制元素 
        glPopMatrix();// 恢复矩阵状态
    }
}

// 显示函数
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和缓存区
    glMatrixMode(GL_MODELVIEW);     //几何变换开启函数
    
// 调用DrawingCircle(xo,yo,R)函数绘制有圆心的圆
    //外圆 
	glColor3f(0.0, 0.0, 0.0); // 设置绘图颜色
    DrawingCircle(750.0, 700.0, 600.0); 
    //内圆 
	glColor3f(1.0, 1.0, 1.0); // 设置绘图颜色
    DrawingCircle(750.0, 700.0, 500.0);
    
// 绘制图形内部的星状部分
    //原图 
	glColor3f(0.0, 0.0, 0.0); // 设置绘图颜色
	DrawStar(750.0, 700.0, 500.0, 0.25, 4);	//星状结构函数参数依次几何中心坐标,半径,叶片宽度占比,叶片数量      
	//几何变换后图形 
	glLoadIdentity(); 
		glTranslatef(750,700,0);	//移到原位置 
		glRotatef(45,0.0,0.0,1.0);	//旋转相应角度
		glTranslatef(-750,-700,0);	//移到原点 
		glColor3f(0.0, 0.0, 0.0);  // 设置绘图颜色为黑色
		DrawStar(750.0, 700.0, 500.0, 0.25, 4); //绘图 
	glLoadIdentity(); 
		          
    glFlush(); // 刷新OpenGL命令缓冲区
}

// 初始化OpenGL环境
void init() {
    glClearColor(1.0, 1.0, 1.0, 1.0); // 设置背景颜色
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 1500.0, 0.0, 1500.0); // 设置正交投影
}

int main(int argc, char** argv) {
    glutInit(&argc, argv); // 初始化GLUT库
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式
    glutInitWindowPosition(800, 200);  // 窗口位置
    glutInitWindowSize(1500, 1500); // 设置窗口大小
    glutCreateWindow("OpenGL_Draw_DesignCircle"); // 创建窗口
    init(); // 调用初始化函数
    glutDisplayFunc(display); // 注册显示回调函数
    glutMainLoop(); // 进入GLUT事件处理循环

    return 0;
}

上手实践

        各位学有余力的先生和女生,如有兴趣的话,不妨参照上面内容,动手绘制下面图片项目,祝你马到成功!

标签:圆心,openGL,星状,图形学,GLfloat,几何变换,图形,include,绘制
From: https://blog.csdn.net/2303_77716250/article/details/142266908

相关文章

  • 第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conf
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年12月13-15日大会地点:中国·南昌三、大会介绍第四届计算机图形学、人工智能与......
  • android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区
    目录一、双缓冲1、概念2、如何使用1、初始化双缓冲2、绘制操作3、交换缓冲区3、优势1、避免屏幕闪烁2、提高渲染效率3、优化资源利用4、注意事项1、内存使用2、交换时间3、同步问题二、默认缓冲1、概念2、如何使用1、渲染操作2、显示操作3、交换缓冲3、注......
  • Qt开发技巧(十九):定时器的调用问题,控件的透明问题,慎用事件过滤器,依赖库的路径链接,对话框
    继续讲一些Qt开发中的技巧操作:1.定时器的调用问题有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,......
  • Android OpenGL光照效果
    在计算机图形学领域,光照仿真是一个重要的研究领域,它对游戏画面的提升、电影和电视节目中的电脑生成图像(CGI)等方面产生了显著影响。通过使用不同的光照算法,我们可以改变场景的外观,例如模拟从白天到夜晚的过渡,或者在山体上产生山峰、峡谷和裂隙的效果。即使是二维场景,也可以通......
  • VS2022安装OpenGL (GLUT)
    VS2022安装OpenGL(GLUT)下载GLUT并解压安装打开VS2022根目录下的include文件夹:...\2022\VC\Tools\MSVC\14.31.31103\include在这里创建一个名为gl的文件夹在gl文件夹中放入glut.h文件打开VS2022根目录下的lib文件夹:xxx\VS2022\VC\Tools\MSVC\14.31.31103\lib打开其中的......
  • ECE 4122/6122 OpenGL with OBJ files and Multiple Objects
    ECE4122/6122Lab3:OpenGLwithOBJfilesandMultipleObjects(100pts)Category:3DGraphicsDue:TuesdayOctober22th,2023by11:59PMObjective:Tocreateadynamic3Dgraphicsapplicationusinglighting,shading,modeltransformations,andkeyboa......
  • OpenGL高级特性超详细入门教程知识点总结攻略学习目录
    OpenGL知识点目录一、OpenGL简介与基本概念二、OpenGL渲染管线与流程三、OpenGL着色器编程四、OpenGL纹理与材质五、OpenGL灯光与阴影六、OpenGL缓冲区与帧缓存七、OpenGL高级特性与最新发展八、如何学习OpenGL九、OpenGL资源简介一、OpenGL简介与基本概念重点详细内容知......
  • OpenGL模型变换平移、缩放、旋转注意事项
    一、概述在OpenGL中,想要对物体(模型)进行操作,如:平移、缩放、旋转。其顺序不能错,不同的顺序会给出不同的结果网上的博客大家看过后要慎重使用,好多都是错误的,在实际项目中使用前最好先写demo进行验证,不然一旦整合到项目中,排错成本将会非常高。三者的顺序是:理......
  • Android OpenGL粒子特效
    在本篇,我们将开启一个新的项目,探索粒子的世界。粒子是一种基本的图形元素,它们通常被表示为一组点。通过巧妙地组合一些基础的物理效果,我们能够创造出许多令人惊叹的视觉效果。想象一下,我们可以模拟一个水滴从喷泉中喷出,然后优雅地落回地面的场景。同样,我们也能模拟出逼真的......
  • Learn OpenGL In Qt之纹理
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~公众号:C++学习与探索 | 个人主页:rainInSunny | 个人专栏:LearnOpenGLInQt文章目录纹理纹理坐标纹理环绕方式纹理采样多级渐远纹理纹理加载和创建加载纹理创建纹理应用纹理纹理纹理坐标  在前面的......