输出图元(四)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.重…...
机器学习与数据分析
【数据清洗】 异常检测 孤立森林(Isolation Forest)从原理到实践 效果评估:F-score 【1】 保护隐私的时间序列异常检测架构 概率后缀树 PST – (异常检测) 【1】 UEBA架构设计之路5: 概率后缀树模型 【…...
项目总结知识点记录-文件上传下载(三)
(1)文件上传 代码: RequestMapping(value "doUpload", method RequestMethod.POST)public String doUpload(ModelAttribute BookHelper bookHelper, Model model, HttpSession session) throws IllegalStateException, IOExcepti…...
基于LinuxC语言实现的TCP多线程/进程服务器
多进程并发服务器 设计流程 框架一(使用信号回收僵尸进程) 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数组和结构体
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示&#…...
基于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 二、查看集群信息:...
肖sir __linux命令拓展__05
linux命令拓展 1.追加内容到某文件 echo “i like learn linux” >>quzhi.txt 2.删除指定的空目录: rmdir 目录名 rmdir -p 目录名 (删除指定的空目录及其内子空目录) 3.显示zip包信息 zipinfo 压缩包名 (显示压缩包内的文…...
大白菜清理电脑密码教程
首先安装大白菜: 插入u盘一键制作启动盘 制作成功,重启进入u盘启动模式...
[libglog][FFmpeg] 如何把 ffmpeg 的库日志输出到 libglog里
ffmpeg 提供了自己的 log 模块 av_log,会默认把输出打印到 stderr 上,因此无法方便地跟踪日志。但是 ffmpeg 提供了一个接口 av_log_set_callback 以供外界自定义自己的日志输出。 libglog 提供的是c 形式的日志输出样式,因此需要将二者关联起…...
【Unity-Cinemachine相机】虚拟相机(Virtual Camera)的本质与基本属性
我们可以在游戏进行时修改各个属性,但在概念上,最好将Virtual Camera 当作一种相机行为的“配置文件”,而不是一个组件。 我们的相机有几种行为就为它准备几种虚拟相机,比如角色移动就为它第三人称相机,瞄准就准备一个…...
LeetCode:718. 最长重复子数组 - Python
718. 最长重复子数组 问题描述: 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长 的 子数组 的 长度 。 示例 1: 输入:nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出:3 解释:长度最长…...
从标定板到生产线:OpenCV实战工业相机畸变校正全流程
1. 工业相机畸变:产线精度杀手的前世今生 第一次在产线上看到相机拍出来的零件尺寸和实物差了0.5毫米时,我盯着屏幕愣了三分钟——这个误差足以让整个自动化装配线变成废品生产线。工业相机的畸变就像近视眼没戴眼镜,看到的物体位置和形状都…...
Kubernetes 与 GitOps 最佳实践
Kubernetes 与 GitOps 最佳实践 一、前言 哥们,别整那些花里胡哨的。GitOps 是现代 Kubernetes 运维的重要趋势,今天直接上硬货,教你如何在 Kubernetes 中实现 GitOps 工作流。 二、GitOps 核心概念 概念描述优势声明式配置所有配置以声明式方…...
USB批量传输中ZLP的必要性:为何512字节整数倍数据包会丢失
1. USB批量传输中的ZLP到底是什么? 第一次遇到USB批量传输丢数据的问题时,我也是一头雾水。明明发送端显示数据已经成功发送,接收端却死活收不到完整数据。后来排查发现,问题出在数据包大小刚好是512字节的整数倍时。这就是我们今…...
3步实现UMA模型吸附能预测:从数据准备到结果验证完整指南
3步实现UMA模型吸附能预测:从数据准备到结果验证完整指南 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 在催化材料研究中,吸附能是评…...
3个强力功能解决微信聊天记录永久保存难题的完整指南
3个强力功能解决微信聊天记录永久保存难题的完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 你…...
PyTorch训练监控神器:用TensorBoard实时可视化Loss曲线与特征图变化(附代码)
PyTorch训练监控神器:用TensorBoard实时可视化Loss曲线与特征图变化(附代码) 深度学习模型的训练过程往往如同黑箱操作,特别是当模型复杂度增加时,仅靠打印日志很难全面把握训练动态。本文将手把手教你使用TensorBoar…...
实时手机检测-通用实战案例:手机质检报告自动生成系统集成方案
实时手机检测-通用实战案例:手机质检报告自动生成系统集成方案 1. 引言:从人工质检到智能报告的跨越 想象一下,在一个大型手机生产线上,质检员每天需要手动检查成千上万张手机外观照片,寻找划痕、污渍、装配瑕疵。这…...
Spring Boot项目实战:手把手教你配置Google Play订阅与Pub/Sub回调(含完整代码)
Spring Boot实战:构建高可靠Google Play订阅与Pub/Sub回调系统 在移动应用商业化路径中,应用内订阅已成为数字服务持续变现的核心模式。根据Statista数据,2023年全球应用订阅收入达到380亿美元,其中Google Play贡献了超过34%的份额…...
RocketMQ Topic队列配置实战指南:从原理到最佳实践
1. RocketMQ Topic队列配置的核心原理 第一次接触RocketMQ的Topic配置时,我也曾被那些专业术语搞得一头雾水。直到有一次线上系统因为队列配置不当导致消息积压,我才真正理解这些参数的重要性。现在回想起来,其实Topic队列配置就像高速公路的…...
MogFace人脸检测模型Java后端服务实战:SpringBoot集成与高并发优化
MogFace人脸检测模型Java后端服务实战:SpringBoot集成与高并发优化 最近在做一个智能门禁系统的项目,需要用到人脸检测功能。选型的时候,MogFace模型以其高精度和不错的速度进入了我们的视线。但问题来了,怎么把这个用Python写的…...
