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

news2025/2/1 4:12:06

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();





}

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

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

相关文章

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

案例挑战—java反射

这里写目录标题 背景一、为什么要使用反射?二、反射的应用反射常用应用的思维导图2.1获取class对象的三种方法示例代码 2.2利用反射获取构造方法示例代码 2.3利用反射获取成员变量示例代码 2.4利用反射获取成员方法 三、总结四、升华 背景 由于在公司自研的新项目架…

Java 乘等赋值运算

下面这个题目是在一公司发过来的,如果你对 Java 的赋值运算比较了解的话,会很快知道答案的。 这个运算符在 Java 里面叫做乘等或者乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数。 例如下面的:density * invertedRat…

LeetCode(力扣)236. 二叉树的最近公共祖先Python

LeetCode236. 二叉树的最近公共祖先 题目链接代码 题目链接 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.…

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking:分布式系统的应用程序性能监视工具 作用:分布式追踪、性能指标分析、应用、服务依赖分析; SkayWalking性能剖析: 我操,能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…

企业架构LNMP学习笔记7

PHP介绍: HTML:超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP:超文本预处理器。后端语言开发,页面上需要动态改变修改的,需要连接数据库查询数据,转为html。 主要…

学习笔记230810--vue项目中get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法,发现没有载荷,ip地址也没有带查询字符串,数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名,而get方法对象方式传参的参数名是parmas 解…

解决uView2 SwipeAction滑动单元格,点击按钮不关闭的问题

1、首先找到安装SwipeAction插件的位置,我的安装在一下位置 2.在 u-swipe-action-item.vue 文件内找到buttonClickHandler方法 3.在buttonClickHandler方法内添加代码 this.status close

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时,需要计算两个日期之间相隔的秒数,我在写的时候直接将两个日期进行相减,得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试,得出的结论是:如果日期类型直接相减&#…

Vue3实现可视化拖拽标签小程序

介绍 实现功能&#xff1a;可视化标签拖拽&#xff0c;双击标签可修改标签内容 HTML结构 <div class"box" v-move><div class"header">标签1</div><div dblclick"startEditing" v-if"!isEditing">{{content…

springboot web开发整合Freemarker 模板引擎

目录 Freemarker添加依赖配置文件ymlcontrollerhtml Freemarker 简介&#xff1a; FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉财经图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉财经图书馆

服务器上使用screen和linux的基本操作

配环境的一点小问题 我们尽量是去配置能满足代码的环境&#xff0c;而不要想着修改代码&#xff0c;让代码在我们的环境上跑起来。 服务器远程拷贝文件 scp -P 10001 c1316xxx.xxx.xx.xxx:/home/duj/local/cuda10.2.tar ./将c1316xxx.xxx.xx.xxx:/home/duj/local/cuda10.2.ta…

Elasticsearch 分布式搜索——聚合

1.聚合的种类 聚合常见的有三类&#xff1a; **桶&#xff08;Bucket&#xff09;**聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例…

MOS场效应管

导体三极管中参与导电的有两种极性的载流子&#xff0c;所以也称为双极型三极管。本文将介绍另一种三极管&#xff0c;这种三极管只有一种载流子参与导电&#xff0c;所以也称为单极型三极管&#xff0c;因为这种管子是利用电场效应控制电流的&#xff0c;所以也叫场效应三极管…

HTML5+CSS3+JS小实例:科技感满满的鼠标移动推开粒子特效

实例:科技感满满的鼠标移动推开粒子特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport&qu…

电压放大器在电子测量中的应用有哪些

电压放大器是一种非常常见的电子器件&#xff0c;广泛应用于各种电子测量中。本文将介绍电压放大器在电子测量中的几个主要应用。 电压放大器在传感器测量中扮演着重要的角色。传感器是将环境物理量转变为电信号的设备&#xff0c;如温度传感器、压力传感器、湿度传感器等。然而…

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的&#xff0c;主要在标黄的部分&#xff0c;裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…

mac idea启动没反应 无法启动

遇到的问题如下&#xff1a; 启动idea&#xff0c;没反应 无法启动&#xff0c;不论破解还是别的原因&#xff0c;总之无法启动了 应用程序–找到idea–右击显示包内容–Contents–MacOS–打开idea 弹出框提示如下&#xff1a; 双击这个idea可执行文件 1&#xff09;先查看日志…