当前位置: 首页 > news >正文

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数
        

        要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值,OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色,而默认的点大小等于单一屏幕像素大小。
使用下面的 OpenCL函数可指定一个点位置的坐标值:glVertex*( ):这里的星号(*)表示该函数要有后级码。这些后级码用来指明空间维数、坐标值变量的数据类型和可能的向量形式坐标描述。在glBegin函数和gEnd函数之间必须插人对gIVertex丽数的调用。glBegin 函数的变量用来指定要显示的输出图元的类型,而 glEnd 函数没有变量。对于点的绘制glBegin函数的变量是符号常量GL_POINTS。因此,一个点位置的OpenGL描述形式是
        glBegin(GLPOINTS):
                glVertex* ( );
        glEnd ():
尽管术语顶点(vetex)严格地代表一个多边形的“角”点一个角两边的交点、圆和其主轴的交点或几何结构中其他类似的坐标位置,但是OpenGL 中的gvertex 函数可用于描述任意一点的位置。这样使用一个简单的函数来描述点、线段和多边形,而更多地使用多边形面片来描述场景对象。

        OpenGL中的坐标位置可以有二维、三维或四维。glvertex的后缀为23或4表示其坐标位置的维数。四维描述意味着齐次坐标(homogeneous-coordinate)表示,其中的齐次参数h(第四维坐标)是笛卡儿坐标值的比例因子。齐次坐标表示对利用矩阵形式表达变换操作很有用,第7章将对其进行详细讨论。由于OpenGL将二维作为三维的特殊情况来处理,任意(xy)坐标描述等同于三维坐标描述(x,y,)。此外OpenGL在内部用四维坐标表示顶点,因此上面的描述等同于四维坐标(x,y,0,1)。
        我们需要指出在坐标的数值描述中使用什么数据结构。这由glvertex函数的第二个后缀来完成。用于指定数值数据类型的后缀是:i(整数)s(短整数)(浮点数)和(双精度浮点数)。最后,glVertex 中可以使用显式的坐标值或引人矩阵形式坐标位置的单个变量。如果使用矩阵形式坐标位置,则需要第三个后缀码:v(“向量”)。

在下面的例子中,在斜率为2的直线上绘出了三个等距离的点(参见图4.3)。坐标用整数对给出:
glBegin (GL_POINTS):
        glVertex2i (50,100);
        glVertex2i(75,150);
        glVertex2i (100,200);
glEnd ();
换一种方法,我们可以将前面这些点的坐标值以矩阵形式描述:
        int pointl[]=[50,100):
        int point2[][75。150]:
        int point3 [ ][100,200]:
并且调用OpenGL函数来绘出这三个点:
glBegin (GL_POINTS);
        glVertex2iv (point1);
        glVertex2iv (point2):
        glVertex2iv (point3):
glEnd ( );

                     

下面再给出一个在三维世界坐标系中描述两个点位置的例子。这里按显式浮点数方式给出坐标:
    gBegin (GL_ POINTS):
        glVertex3f(-78.05,909.72,14.60):
        glVertex3f(261.91,-5200.67,188.33):
    glEnd ():
我们还可以为各种维数中描述的点位置定义C++类或结构(struct)。例如
class wcPt2D{

        public:
        GLfloat x.y:

}

有了这一类定义,我们可以使用下列语句描述一个二维世界坐标系中的点位置:
wcPt2D pointPos:
pointPos.x=120.75:
pointPos.y-45.30:
glBegin (GL_POINTS):
        8lVertex2f (pointPos,x,pointPos.y);
glEnd ( ):
我们也可以在C++过程中使用OpenGL画点函数来实现setPixel命令。

 

4.4 OpenGL画线函数

 
        图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义。在OpenGL中和选择一个点位置一样,使用glVertex函数选择单个端点的坐标位置我们可以使用glBegin/glEnd的配对来引人一串端点位置。有三个OpenGL符号常量可以用于指定如何把这一串端点位置连接成一组直线段。默认情况下,每一符号常量显示白色的实线

        使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段。通常,由于OpenGL仅在线段共享一个顶点时承认其相连;交叉但不共享顶点的线段则不被承认其相连,这会导致一组未连接的线段,除非某些坐标位置是重复的。如果只描述了一个端点则什么也不会显示,如果列出的端点数为奇数则最后一个端点不被处理。例如,如果我们有5个坐标位置,标成 p1 到p5,每一个用二维数组表示,则下列程序能生成图4.4(a):

  glBegin (GL LINES);
        glVertex2iv(p1);
        glVertex2iv (p2);
        glVertex2iv (p3):
        glVertex2iv(p4);
        glVertex2iv(p5):
glEnd ():

        这样,我们在第一和第二坐标位置之间得到一条直线段并在第三和第四位置之间得到另一条直线段。此时,指定的端点数为奇数,因此最后一个坐标位置被忽略。

        使用OpenGL的图元常量GL_LINE_STRIP可以获得折(polyline)。此时,显示从第一个端点到最后一个端点之间一组首尾相连的线段。第一条线段在第一端点和第二端点之间显示第二条线段在第二端点和第三端点之间显示;依次进行,直到最后一个端点。如果不列出至少两个坐标位置,则什么也不显示。使用上例中的5个坐标位置,我们用下列程序生成图4.4(b):

    int point1[] = { 70,70 };
    int point2[] = { 25,35 };
    int point3[] = { 45,100 };
    int point4[] = { 65,35 };
    int point5[] = { 23,70 };

glBegin (GL_LINE_STRIP):
        gVertex2iv(p1);
        glVertex2iv (p2):
        glVertex2iv (p3);
        glVertex2iv (p4):
        glVertex2iv(p5);
glEnd ();


第三个OpenGL图元常量是生成封闭折线(closed polyline)的GL_LINE_LOOP。主要的线段和使用GL_LINE_STRIP一样画出,但是增加了一条直线段,将最后一个端点与第一个端点相连接图4.4(c)给出了使用这一线选项对端点组的显示:
glBegin (GL_ LINE_ LOOP):
        glVertex2iv(p1);
        g1Vertex2iv (p2):
        glVertex2iv(p3):
        glVertex2iv(P4):
        glVertex2iv(p5);
glEnd ():

        如前所述,世界坐标系中描述的图形部分最终要映射到输出设备的坐标系统中。然后图中的几何信息被扫描转换到像素位置。在6.1节我们将讨论实现penCL 画线函数的扫描转换算法

部分测试代码:

#include "stdafx.h"
#include "windowOneLine.h"void init(void) {glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 250.0);}void lineSegment(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(5.0,0.0,0.0);// 窗口上画线/**glBegin(GL_LINES);glVertex2i(180,15);glVertex2i(10,145);glEnd();**///绘制三个点 斜率为2/**glBegin(GL_POINTS);glVertex2i(50,100);glVertex2i(75,150);glVertex2i(100,200);glEnd();**//**绘制三个点 斜率为2 换一种方法,我们可以将前面这些点的坐标值以矩阵形式描述: ;最后,glVertex 中可以使用显式的坐标值或引人矩阵形式坐标位置的单个变量。如果使用矩阵形式坐标位置,则需要第三个后缀码:v(“向量”)。** /int point1[] = { 50,100 };int point2[] = { 75,150 };int point3[] = { 100,200 };glBegin(GL_POINTS);glVertex2iv(point1);glVertex2iv(point2);glVertex2iv(point3);glEnd();**//**下面再给出一个在三维世界坐标系中描述两个点位置的例子。这里按显式浮点数方式给出坐标:** /glBegin(GL_POINTS);glVertex3f(78.5,909.72,14.60);glVertex3f(61.91,52.67,183.33);glEnd();**//**我们还可以为各种维数中描述的点位置定义C++类或结构(struct)。** /wcPt2d pointPos;pointPos.x = 120.75;pointPos.y = 45.30;glBegin(GL_POINTS);glVertex2f(pointPos.x,pointPos.y);glEnd();**//**画个五角星 使用5个端点坐标可以显示的线段:(a)使用图元常量GL_LINES生成一组未连接的线段;(b)使用GL_LINE_STRIP生成一折线;(c)使用GLLINE_LOOP生成封闭折线**/int point1[] = { 70,70 };int point2[] = { 25,35 };int point3[] = { 45,100 };int point4[] = { 65,35 };int point5[] = { 23,70 };//glBegin(GL_POINTS); //五个点//glBegin(GL_LINES); //两条无相关的线,point5 被忽略//glBegin(GL_LINE_STRIP); //4条1-2,2-3,3-4,4-5相关关联的折线;glBegin(GL_LINE_LOOP); // 五角星glVertex2iv(point1);glVertex2iv(point2);glVertex2iv(point3);glVertex2iv(point4);glVertex2iv(point5);glEnd();glFlush();
}void main(int argc, char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(50,100);glutCreateWindow("An Examle OpenGL Program ");init();glutDisplayFunc(lineSegment);glutMainLoop();}

相关文章:

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数 要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值,OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色&#x…...

java八股文

6. 如何保证消息的可靠性? 在RabbitMq的整个消息投递过程中,有三种情况下,会存在消息丢失的问题: 6. RabbitMq如何保证消息的可靠性? 所以从这三个维度保证消息的可靠性去可靠性传递就可以了,从生产者发送…...

算法通关村——解析堆的应用

在数组中找第K大的元素 LeetCode21 Medium 我们要找第 K 大的元素,如果我们找使用大堆的话那么就会造成这个堆到底需要多大的,而且哪一个是第 K 的的元素我们不知道是哪一个索引,我们更想要的结果就是根节点就是我们要找的值,所以…...

爬虫源码---爬取小猫猫交易网站

前言: 本片文章主要对爬虫爬取网页数据来进行一个简单的解答,对与其中的数据来进行一个爬取。 一:环境配置 Python版本:3.7.3 IDE:PyCharm 所需库:requests ,parsel 二:网站页面 我们需要…...

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…...

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…...

MySQL 基本操作1

目录 Create insert 插入跟新 1 插入跟新 2 Retrive select where 子句查询 1.查找数学成绩小于 80 的同学。 2.查询数学成绩等于90分的同学。 3.查询总分大于240 的学生 4.查询空值或者非空值 5.查询语文成绩在70~80之间的同学 6.查询英语成绩是99 和 93 和 19 和…...

linux内网yum源服务器搭建

1.nginx: location / {root /usr/local/Kylin-Server-V10-SP3-General-Release-2303-X86_64;autoindex on;autoindex_localtime on;autoindex_exact_size off; } 注:指定到镜像的包名 2.修改yum源地址 cd /etc/yum.repos.d/vim kylin_x86_64.repo 注: --enabled设置为1 3.重…...

机器学习与数据分析

【数据清洗】 异常检测 孤立森林&#xff08;Isolation Forest&#xff09;从原理到实践 效果评估&#xff1a;F-score 【1】 保护隐私的时间序列异常检测架构 概率后缀树 PST – &#xff08;异常检测&#xff09; 【1】 UEBA架构设计之路5&#xff1a; 概率后缀树模型 【…...

项目总结知识点记录-文件上传下载(三)

&#xff08;1&#xff09;文件上传 代码&#xff1a; RequestMapping(value "doUpload", method RequestMethod.POST)public String doUpload(ModelAttribute BookHelper bookHelper, Model model, HttpSession session) throws IllegalStateException, IOExcepti…...

基于LinuxC语言实现的TCP多线程/进程服务器

多进程并发服务器 设计流程 框架一&#xff08;使用信号回收僵尸进程&#xff09; void handler(int sig) {while(waitpid(-1, NULL, WNOHANG) > 0); }int main() {//回收僵尸进程siganl(17, handler);//创建服务器监听套接字 serverserver socket();//给服务器地址信息…...

浅谈JVM垃圾回收机制

一、HotSpot VM中的GC分为两大类 1.部分收集(Partial GC): 新生代收集(Minor GC/Young GC):只对新生代进行垃圾收集老年代收集(Major GC/Old GC):只队老年代进行垃圾收集混合收集(Mixed GC):对整个新生代和老年代进行垃圾收集 2.整堆收集(Full GC) 收集整个Java堆和方法区 …...

【80天学习完《深入理解计算机系统》】第十二天3.6数组和结构体

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…...

基于Python+OpenCV智能答题卡识别系统——深度学习和图像识别算法应用(含Python全部工程源码)+训练与测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PyCharm安装OpenCV环境 模块实现1. 信息识别2. Excel导出模块3. 图形用户界面模块4. 手写识别模块 系统测试1. 系统识别准确率2. 系统识别应用 工程源代码下载其它资料下载 前言 本项目基于Python和OpenCV图像处…...

Redis集群操作-----主从互换

一、将节点cluster1的主节点7000端口的redis关掉 [rootredis-cluster1 src]# ps -ef |grep redis 二、查看集群信息&#xff1a;...

肖sir __linux命令拓展__05

linux命令拓展 1.追加内容到某文件 echo “i like learn linux” >>quzhi.txt 2.删除指定的空目录&#xff1a; rmdir 目录名 rmdir -p 目录名 &#xff08;删除指定的空目录及其内子空目录&#xff09; 3.显示zip包信息 zipinfo 压缩包名 &#xff08;显示压缩包内的文…...

大白菜清理电脑密码教程

首先安装大白菜&#xff1a; 插入u盘一键制作启动盘 制作成功&#xff0c;重启进入u盘启动模式...

[libglog][FFmpeg] 如何把 ffmpeg 的库日志输出到 libglog里

ffmpeg 提供了自己的 log 模块 av_log&#xff0c;会默认把输出打印到 stderr 上&#xff0c;因此无法方便地跟踪日志。但是 ffmpeg 提供了一个接口 av_log_set_callback 以供外界自定义自己的日志输出。 libglog 提供的是c 形式的日志输出样式&#xff0c;因此需要将二者关联起…...

【Unity-Cinemachine相机】虚拟相机(Virtual Camera)的本质与基本属性

我们可以在游戏进行时修改各个属性&#xff0c;但在概念上&#xff0c;最好将Virtual Camera 当作一种相机行为的“配置文件”&#xff0c;而不是一个组件。 我们的相机有几种行为就为它准备几种虚拟相机&#xff0c;比如角色移动就为它第三人称相机&#xff0c;瞄准就准备一个…...

LeetCode:718. 最长重复子数组 - Python

718. 最长重复子数组 问题描述&#xff1a; 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长 的 子数组 的 长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...