qt opengl 绘制点、线、三角形、多边形(二)

news2024/11/26 6:20:45

文章目录

  • 一、相关宏定义参数
  • 二、代码及示例图
    • 1. 点 LG_POINTS 0x0000
    • 2. 线 GL_LINES 0x0001
    • 3. 线 GL_LINE_LOOP 0x0002
    • 4. GL_LINE_STRIP 0x0003
    • 5. GL_TRIANGLES 0x0004
    • 6. GL_TRIANGLE_STRIP 0x0005
    • 7. GL_TRIANGLE_FAN 0x0006
    • 8. GL_QUADS 0x0007
    • 9. GL_QUAD_STRIP 0x0008
    • 10. GL_POLYGON 0x0009
  • 总结


一、相关宏定义参数

#define GL_POINTS 0x0000        // 点
#define GL_LINES 0x0001         // 直线线段,按添加点的顺序,每2个点组成一条线段
#define GL_LINE_LOOP 0x0002     // 直线线段,按添加点的顺序,相邻的两个点连接,且第一个点与最后一个点也连接(多边形)
#define GL_LINE_STRIP 0x0003    // 与GL_LINE_LOOP类似,区别在于 第一个点与最后一个点 不 连接
#define GL_TRIANGLES 0x0004     // 按添加点的顺序, 每3个点组成三角(面)
#define GL_TRIANGLE_STRIP 0x0005// 三角(面) ,区别见后面代码演示
#define GL_TRIANGLE_FAN 0x0006  // 三角(面),区别见后面代码演示
#define GL_QUADS 0x0007         // 
#define GL_QUAD_STRIP 0x0008    // 
#define GL_POLYGON 0x0009       // 

二、代码及示例图

1. 点 LG_POINTS 0x0000

void MOpenGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    //点大小
    glPointSize(6.0f);
    //启动绘制(点)
    glBegin(GL_POINTS);
    {
        //
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, 0.0f, 0.0f);

        glVertex3f(-0.5f, 0.0f, 0.0f);

        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);

        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.5f, 0.0f, 0.0f);

        glVertex3f(1.0f, 0.0f, 0.0f);
    }
    //结束绘制
    glEnd();
}

在这里插入图片描述

2. 线 GL_LINES 0x0001

//启动绘制(线段)
glBegin(GL_LINES);
{
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex3f(-1.0f, 0.0f, 0.0f);
    glVertex3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, -1.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
}
//结束绘制
glEnd();

在这里插入图片描述

3. 线 GL_LINE_LOOP 0x0002

//启动绘制(多边形直线)
glBegin(GL_LINE_LOOP);
{
    glColor3f(1,0,0);
    glVertex2f(-1.0f, 0.0f);

    glColor3f(0,1,0);
    glVertex2f(0.0f, -1.0f);

    glColor3f(0,0,1);
    glVertex2f(1.0f, 0.0f);

    glColor3f(1,1,1);
    glVertex2f(0.0f, 1.0f);
}
//结束绘制
glEnd();

在这里插入图片描述

4. GL_LINE_STRIP 0x0003

//启动绘制(连续的线段)
glBegin(GL_LINE_STRIP);
{
    glColor3f(1,0,0);
    glVertex2f(-0.5f, 0.0f);

    glColor3f(0,1,0);
    glVertex2f(0.0f, -0.5f);

    glColor3f(0,0,1);
    glVertex2f(0.5f, 0.0f);

    glColor3f(1,1,1);
    glVertex2f(0.0f, 0.5f);
}
//结束绘制
glEnd();

在这里插入图片描述

5. GL_TRIANGLES 0x0004

先将所用的点画出

	//点大小
    glPointSize(6.0f);
    //
    glBegin(GL_POINTS);
    {
        glColor3f(0, 0, 0);
        
        glVertex3f( -0.9f, 0.2f, 0.0f);
        glVertex3f( -0.7f, -0.2f, 0.0f);
        glVertex3f( -0.5f, 0.2f, 0.0f);
        
        glVertex3f( -0.3f, -0.2f, 0.0f);
        glVertex3f( -0.1f, 0.2f, 0.0f);
        glVertex3f( 0.1f, -0.2f, 0.0f);
        
        glVertex3f( 0.3f, 0.2f, 0.0f);
        glVertex3f( 0.5f, -0.2f, 0.0f);
        glVertex3f( 0.7f, 0.2f, 0.0f);
    }
    glEnd();

GL_TRIANGLS绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P ~n ~}
组成的三角形为:{ P0, P1, P2 } 、{ P3, P4, P5 } 、… 、{ Pn-5, Pn-4, Pn-3 } 、{ Pn-2, Pn-1, Pn }

// 启动绘制(三角形)
glBegin(GL_TRIANGLES);
{
    glColor3f(0, 0, 0);
    glVertex3f( -0.9f, 0.2f, 0.0f);
    glColor3f(1, 0, 0);
    glVertex3f( -0.7f, -0.2f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f( -0.5f, 0.2f, 0.0f);
    
    glColor3f(1, 1, 0);
    glVertex3f( -0.3f, -0.2f, 0.0f);
    glColor3f(0, 0, 1);
    glVertex3f( -0.1f, 0.2f, 0.0f);
    glColor3f(1, 0, 1);
    glVertex3f( 0.1f, -0.2f, 0.0f);

    glColor3f(0, 1, 1);
    glVertex3f( 0.3f, 0.2f, 0.0f);
    glColor3f(1, 1, 1);
    glVertex3f( 0.5f, -0.2f, 0.0f);
    glColor3f(0, 0, 0);
    glVertex3f( 0.7f, 0.2f, 0.0f);
}
glEnd();

在这里插入图片描述

6. GL_TRIANGLE_STRIP 0x0005

与第5小节所用的代码不变,仅glBegin(GL_TRIANGLE);改为glBegin(GL_TRIANGL_STRIP);所得结果如下图。

GL_TRIANGL_STRIP绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P n }
组成的三角形为:{ P0, P1, P2 } 、{ P1, P2, P3 } 、{ P2, P3, P4} 、… 、{ Pn-3, Pn-2, Pn-1} 、{ Pn-2, Pn-1, Pn}

在这里插入图片描述

7. GL_TRIANGLE_FAN 0x0006

与第5小节所用的代码不变,仅glBegin(GL_TRIANGLE);改为glBegin(GL_TRIANGL_FAN);所得结果如下图。

GL_TRIANGL_STRIP绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P n }
组成的三角形为:{ P0, P1, P2 } 、{ P0, P2, P3 } 、… 、{ P0, Pn-2, Pn-1 } 、、{ P0, Pn-1, Pn }

在这里插入图片描述

8. GL_QUADS 0x0007

标记所用点位

//点大小
glPointSize(6.0f);
//
glBegin(GL_POINTS);
{
	//这里画点添加顺序与画四边形顺序不一致,这里只是为了画出用到的点,方便理解,与画四边形无任何关联
    glColor3f(0, 0, 0);
    glVertex3f(-1.0f, -0.55f, 0.0f);
    glVertex3f(-1.0f, -0.95f, 0.0f);
    glVertex3f(-0.6f, -0.55f, 0.0f);
    glVertex3f(-0.6f, -0.95f, 0.0f);
    glVertex3f(-0.2f, -0.55f, 0.0f);
    glVertex3f(-0.2f, -0.95f, 0.0f);
    glVertex3f(0.2f, -0.95f, 0.0f);
    glVertex3f(0.2f, -0.55f, 0.0f);
    glVertex3f(0.6f, -0.55f, 0.0f);
    glVertex3f(0.6f, -0.95f, 0.0f);
    glVertex3f(1.0f, -0.95f, 0.0f);
    glVertex3f(1.0f, -0.55f, 0.0f);
}
glEnd();
//!GL_QUADS四边形
glBegin(GL_QUADS);
{
    glColor3f(0, 0, 0);
    glVertex3f(-1.0f, -0.55f, 0.0f);
    glColor3f(1, 0, 0);
    glVertex3f(-1.0f, -0.95f, 0.0f);

    glColor3f(1, 1, 0);
    glVertex3f(-0.6f, -0.55f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f(-0.6f, -0.95f, 0.0f);


    glColor3f(0, 0, 1);
    glVertex3f(-0.2f, -0.55f, 0.0f);
    glColor3f(1, 0, 1);
    glVertex3f(-0.2f, -0.95f, 0.0f);

    glColor3f(0, 1, 1);
    glVertex3f(0.2f, -0.95f, 0.0f);
    glColor3f(1, 1, 1);
    glVertex3f(0.2f, -0.55f, 0.0f);


    glColor3f(0, 0, 0);
    glVertex3f(0.6f, -0.55f, 0.0f);
    glColor3f(0, 0, 1);
    glVertex3f(1.0f, -0.55f, 0.0f);

    glColor3f(0, 1, 0);
    glVertex3f(0.6f, -0.95f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f(1.0f, -0.95f, 0.0f);

}
glEnd();

在这里插入图片描述

如上图和示例代码,绘制了12个点及由这12点分别组成的3个四边形,图中标注了点坐标添加顺序。
从上图可以分析出如下特征:

  1. 添加N个顶点,每4个组成一个四边形。(若N%4不为0,那只能画出N/4个四边形,多出的N%4个顶点无用)
  2. 四边形是按照顶点添加顺序绘制的
    (这部分是个人理解,不确定是否有错)

9. GL_QUAD_STRIP 0x0008

延用第8小节所用的代码,仅glBegin(GL_QUADS);改为glBegin(GL_QUAD_STRIP);所得结果如下图。
在这里插入图片描述

从图中可以发现,顶点是可以共用的,好比两栋楼相邻的一面共用一堵墙。
图中有 { P0, P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11} 等12个顶点。
组成的四边形:{ P0,P1 ,P2 ,P3 }、{ P2,P3 ,P4 ,P5 }、{ P4,P5 ,P6 ,P7 }、{ P6,P7 ,P8 ,P9 }、{ P8,P9 ,P10 ,P11 }
绘制顺序:
… 1. 定义每个四边形中,第一个点是P0,第二个点是 P1,第三个点是 P2,第四个点是 P3
… 2. 绘制路线: P0 --》 P1 --》P3 、P0 --》 P2 --》P3 ,形成的四边形就是最终结果
(这部分是个人理解,不确定是否有错)

10. GL_POLYGON 0x0009

   //多边形
    glBegin(GL_POLYGON);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f(-0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f(-1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f(-0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f(-0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f(-0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f(-0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f(-0.4f, 0.75f, 0.0f);
        //1
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex3f(-0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-0.7f, 0.75f, 0.0f);

    }
    glEnd();

    glBegin(GL_POINTS);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f(-0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f(-1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f(-0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f(-0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f(-0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f(-0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f(-0.4f, 0.75f, 0.0f);
        //1
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(-0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-0.7f, 0.75f, 0.0f);
    }
    glEnd();

    //多边形
    glBegin(GL_POLYGON);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f( 0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f( 1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f( 0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f( 0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f( 0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f( 0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f( 0.4f, 0.45f, 0.0f);
        //1
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex3f( 0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f( 0.7f, 0.45f, 0.0f);

    }
    glEnd();

    glBegin(GL_POINTS);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f( 0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f( 1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f( 0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f( 0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f( 0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f( 0.3f, 0.60f, 0.0f);
        //2
        glColor3f(0.5f, 0.5f, 0.5f);
        glVertex3f( 0.4f, 0.45f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f( 0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f( 0.7f, 0.45f, 0.0f);
    }
    glEnd();

在这里插入图片描述

按顺序绘制,只能绘制凸多边形,不能绘制凹多边形


总结

以上内容为个人学习理解,可能存在错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第八章 Python类(面向对象编程)

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

数票通批量开票小妙招,双11开票不用愁

每年双十一都是电商企业和财务“疯狂”的日子,随着疫情的回暖,消费者的消费能力蹭蹭上涨,商家的口袋盆满钵满,而财务的加班永无休止,批量开票成为财务人摆脱双十一加班的必备技能。 面对双十一狂欢,相信不少…

一文带你深入浅出Web的自动化测试工具Selenium【建议收藏】

文章目录 前言第01节 Selenium概述第02节 安装浏览器驱动(以Google为例)第03节 定位页面元素1. 打开指定页面2. id 定位3. name 定位4. class 定位5. tag 定位6. xpath 定位7. css 选择器8. link 定位9. 示例 有道翻译 第04节 浏览器控制1. 修改浏览器窗…

3D目标检测实战 | 图解KITTI数据集评价指标AP R40(附Python实现)

目录 1 准确率和召回率2 P-R曲线的绘制3 AP R11与AP R40标准4 实际案例 1 准确率和召回率 首先给出 T P TP TP、 F P FP FP、 F N FN FN、 T N TN TN的概念 真阳性 True Positive T P TP TP 预测为正(某类)且真值也为正(某类)的样本数,可视为 I o U > I o U t…

3Dmax Vary 渲染 玻璃 水 啤酒 的参数尝试

折射率: 空气折射率为1.0 水折射率一般 1.3 -1.4 ,啤酒折射率一般 1.4-1.55 玻璃折射率 一般 1.5-1.7 金刚石钻石 2.0 透明物体 密度越大 折射率越高。折射:同一束光在不同密度介质传播时发生的 光路弯折。如果密度不断发生变化&#…

C++常用格式化输出

在C语言中可以用printf以一定的格式打印字符,C当然也可以。 输入输出及命名空间还不太了解的小伙伴可以看一看C入门讲解第一篇。  在C中,可以用流操作符(stream manipulators)控制数据的输出格式,这些流操作符定义在2…

UE5——源码阅读——4——引擎预初始化

预初始化的开始处理和结束处理 将GEnginePreInitPreStartupScreenEndTime设置为平台的时间 ON_SCOPE_EXIT 这个就是在程序结束后执行一个Lambda,这个弘的目的是简化代码确保正确的时机正确的执行清理操作,降低因资源泄露而导致BUG的概率 处理延迟注册…

【GEE】基于GEE-Landsat8数据集地表温度反演(LST热度计算)

老样子,最近在做生态方面的项目,然后需要分析城市的热岛效应,想了想还是用GEE计算比较简单,直接下载影像太麻烦了。所以在网上看看了资料,踩了踩坑终于是将代码写出来了。秉承着取之于民、用之于民的想法,今…

如何解决msvcp140.dll文件丢失问题,msvcp140.dll丢失的解决方法

在使用电脑时,有时我们可能会遇到一些错误提示,比如“找不到msvcp140.dll文件”。这是因为某些程序需要依赖于msvcp140.dll文件才能正常运行。这个问题是可以解决的,大家不需要担心,而且其解决的方法是有很多种的,今天我们就来给大…

VS编译器中创建新源文件,自动添加----#define _CRT_SECURE_NO_WARNINGS 1

每次创建新的源文件时都需要添加比较麻烦,我们让每次创建时自动添加,步骤如下: 1、右键编译器--->属性--->目标(存放的是编译器的文件位置我们找到文件的位置) 2、如下步骤找到“newc file.cpp”文件&#xff0…

MySQL基础之约束、多表查询、事务【基础完结】

1 SQL约束 SQL约束是用于规定表中的数据规则,如果存在违反约束的数据行为,行为会被终止。 1.1 如何创建约束 • 在创建表的时候进行规定(create table)• 修改表的时候进行规定(alter table) 1.2 约束的…

设计师的宝库:5个供应免费素材的设计网站

今天给大家推荐五个设计素材网站,设计师看到就要码住,码住就是灵感。 即时设计 即时设计是一个可在线使用的设计资源网站,在网页中打开「即时设计」的官网,登录账号后即可使用即时设计提供的设计资源。 即时设计 - 可实时协作的…

史上最全Windows安全工具汇总

史上最全Windows安全工具锦集来源于网络整理,安全性自测。 下载方式:史上最全Windows安全工具汇总

为了理直气壮怼回去,写了一个日志切面输出接口出入参数

1.背景 我们在日常排查问题过程中知道,入参传错是导致接口调用失败的常见原因之一。特别是提供给第三方调用的回调接口和openAPI接口,由于无法保证第三方开发人员的水平,经常问题不断,反反复复找你问为啥掉不通,甚至吐…

多人游戏小程序源码系统 带完整的搭建教程

现如今,人们对于娱乐和社交的需求也在不断提高。多人游戏作为一种能够满足人们社交需求的游戏类型,越来越受到用户的欢迎。同时,小程序作为一种轻量级的应用程序,在微信等平台上得到了广泛的应用和推广。因此,开发多人…

【LeetCode力扣】287.寻找重复数(中等)

1、题目介绍 原题链接&#xff1a;287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [1,3,4,2,2] 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [3,1,3,4,2] 输出&#xff1a;3提示&#xff1a; 1 < n &l…

hbase代码报错(以及解决方法)

》》》直接上代码 package HBase_Apiimport org.apache.hadoop.conf.Configuration import org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{Connection, ConnectionFactory, Get, Put} import org.apache.hadoop.hbase.ut…

烟台海森大数据——数据驱动材料研发,本土化为安全护航

随着大数据时代的来临&#xff0c;人们的生产和生活&#xff0c;各方面都在发生着深刻的变化。作为与国计民生息息相关的材料行业&#xff0c;也在数据时代迎来了新的机遇与挑战。 新材料是我国重点推进的战略性新兴产业之一&#xff0c;对于支撑整个战略性新兴产业发展&#…

海康Visionmaster-全局脚本:通过全局脚本加载本地图像的方法

通过 VM 的全局脚本加载本地图像的步骤如下所示&#xff1a; 1、打开全局脚本&#xff0c;选择需要的示例 2、在运行函数中插入如下代码 1. public int Process() 2. { 3. //m_operateHandle 二次开发 SDK 操作句柄 4. if (m_operateHandle IntPtr.Zero) 5. { return ImvsSd…

Solidity在函数里面返回中文报错原因

错误 from solidity: ParserError: Invalid character in string. If you are trying to use Unicode characters, use a unicode"…" string literal. –> contracts/text.sol:90:24: | 90 | return (1,true,“你好”); 原因与解决方法 在Solidity中&#xff0c;…