2.绘制简单的几何图形

一、点、直线和多边形

  数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备如何精确,

  始终不能输出一个无穷小的点。一般情况下,OpenGL中的点将被画成单个的像素,虽然它可能足够小,但并不会是无穷小。

  同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实现。

  同样的,数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。

  可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。多边形是由多条线段首尾相连而形成的闭合区域。

  OpenGL规定,一个多边形必须是一个“凸多边形”(其定义为:多边形内任意两点所确定的线段都在多边形内,由此也可以推导出,凸多边形不能是

  空心的)。多边形可以由其边的端点(这里可称为顶点)来确定。

  (注意:如果使用的多边形不是凸多边形,则最后输出的效果是未定义的——OpenGL为了效率,放宽了检查,这可能导致显示错误。要避免这个错误,

  尽量使用三角形,因为三角形都是凸多边形)

  可以想象,通过点、直线和多边形,就可以组合成各种几何图形。甚至于,你可以把一段弧看成是很多短的直线段相连,这些直线段足够短,以至于其长度

  小于一个像素的宽度。这样一来弧和圆也可以表示出来了。通过位于不同平面的相连的小多边形,我们还可以组成一个“曲面”。

二、OpenGL中指定顶点

  由以上的讨论可以知道,“点”是一切的基础。  

  如何指定一个点呢?OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和1~2个字母。例如:

    glVertex2d  glVertex2f  glVertex3f  glVertex3fv等等。

  数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个。

  字母表示参数的类型,

    s表示16位整数(OpenGL中将这个类型定义为GLshort)

  i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei)

  f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf)

  d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)

   v表示传递的几个参数将使用指针的方式,见下面的例子。

  这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:

    glVertex2i(1, 3);

    glVertex2f(1.0f, 3.0f);

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

    glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);

    GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};

  glVertex3fv(VertexArr3);

  以后将用glVertex*来表示这一系列函数,OpenGL很多函数都是采用这样的形式,一个相同的前缀加上参数标记说明。

三、开始绘制

  OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。

    glBegin(GL_POINTS);

    glVertex2f(0.0f, 0.0f);

    glVertex2f(0.5f, 0.0f);

    glEnd();

  则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。

  我们还可以指定更多的顶点,然后画出更复杂的图形。

  glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,

  GL_TRIANGLE_FAN等。

  

时间: 2024-08-25 05:24:10

2.绘制简单的几何图形的相关文章

OpenGL学习-------绘制简单的几何图形

本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的点,只有位置,没有大小.但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点.另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点.一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它可能足够小,但并不会是无穷小.同一像素上,Op

IOS图像处理(1)绘制简单的几何图形

通过CoreGraphic绘制图像一般有以下几个步骤: 1:获取图形上下文对象 绘制图像首先需要取得图形上下文对象(CGContextRef),系统中维护一个CGContextRef的栈,在UI控件的drawRect方法调用前,系统会为当前绘图环境创建一个图形上下文对象并且置于CGContextRef栈顶,通过UIGraphicsGetCurrentContext()可以取得这个图像上下文对象. 2:设置绘画的属性,可以配置线条颜色,填充颜色,线条宽度,阴影,线段端点形状,点线模式,线条连接点风

Java入门:绘制简单图形

在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.awt包中.在我们自己的java程序文件中,要使用Graphics类就需要使用import java.awt.Graphics语句将Graphics类导入进来. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等.本项目仅用到画直线的功

opengl使用现在比较常用的方法来绘制简单几何图元

上一篇文章中也使用了比较老的方法glBegin 和 glEnd的方法来绘制了简单的集合图元,现在使用比较新的而且更高效的方法来绘制简单的集合图元. 这种方法与以前方法的不同点在对数据的处理上,glBegin 和 glEnd是要给出数据,然后直接来进行绘制,然而新的方法是现将数据保存到显存中,然后直接一个绘制命令,就可以直接从显卡内存中直接读取数据进行绘制,效率更高而且更方便. #include <GL/glew.h> #include <GL/freeglut.h> #includ

shape-自绘制简单图形

shape 可以绘制简单的图形,颜色等.它主要就是应用于selector 的一些状态. 本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27/2612023.html 自己验证了下,学习记录 它主要有以下几个部分,分别是 填充(solid):设置填充的颜色 间隔(padding):设置四个方向上的间隔 大小(size):设置大小 圆角(corners):设置图形圆角,默认是正方形的 渐变(gradient):当设置填充颜色后,无渐变效果

学习笔记:HTML5 Canvas绘制简单图形

HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" width="1024" style="border:1px solid #aaa;text-align:center;"> 你的浏览器不支持Canvas,请更新浏览器再试!!! </canvas> 在canvas标签之间应该做浏览器是否支持的检测,

SDL绘制简单几何图形

用到的API SDL_SetRenderDrawColor(SDL_Renderer* renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a) SDL_RenderClear(SDL_Renderer* renderer) SDL_RenderFillRect(SDL_Renderer* renderer, const SDL_Rect *rect) SDL_RenderDrawRect(SDL_Renderer* renderer, const SDL_Re

OpenGL绘制简单的参数曲线——三阶Bezier曲线(二)

今天我们来介绍三次Bezier曲线,这曲线网上资料非常多,我这里只是简单介绍下原理. 在二维空间中(三维也类似),给定n+1个点P0.P1.... .Pn.参数t的n次的Bezier曲线是: 图1 我们根据上面式子可以推出一阶.二阶.三阶贝塞尔曲线,下面是一阶贝塞尔曲线: 图2 下面是二阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,每一个Q0Q1都是曲线的切向量: 图3 下面是三阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,P2P3线段取Q2,再从Q0Q1取R

Quartz 2D绘制简单图形

在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UIKit class QuartzView: UIView { // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance duri