OpenGL库中提供了多种图元绘制的函数,但是不知为何圆弧一直不在其中,最近的项目刚好涉及到OpenGL圆与圆弧的绘制,在本篇博客上简单总结。

首先先介绍圆的绘制:这里采用用线段逼近的方法,与其他博主用点逼近相比,线段逼近的复杂度更低一些,同时看上去效果更好。

假设我们用N=100个点产生100条线段去进行圆的逼近,将所计算得到的点用vector保存。详见代码:先定义好PI(圆周率),这是因为标准库中的正弦余弦函数都是用弧度制为参数类型,再定义好Point结构体即可。

const float pi=3.14159;struct Point{float x,y,z;Point(float _x,float _y,float _z=0.0f):x(_x),y(_y),z(_z){}
};class Draw{
public:void drawCircle();void drawArc();void getPointOfCircle(float radius);void getPointOfArc(float radius,float start_angle,float end_angle);
private:vector<Point> circle;vector<Point> arc;
};void Draw::getPointOfCircle(float radius){int N=100;for(int i=0;i<N;i++)circle.push_back(Point(radius*cos(2*pi/N*i),radius*sin(2*pi/N*i)));
}void Draw::drawCircle()
{glBegin(GL_LINE_LOOP);for(int i=0;i<circle.size();i++){glVertex3f(circle[i].x, circle[i].y, circle[i].z);}glEnd();
}

接下来讨论圆弧的绘制问题,有了圆的绘制作为基础,圆弧的绘制无非是多了两个参数,起始角度(start_angle)与终止角度(end_angle),需要注意的是起始角度有可能大于终止角度,例如起始角度为300度,终止角度为20度,实际上是要画从300-360度,再从0-20度的圆弧,因此要分别讨论(1)起始角度小于终止角度 (2)起始角度大于终止角度

绘制圆弧还是采用线段逼近的方法,但是注意将圆弧N等分后,角度从起始角度开始计算。详见代码:

void Draw::getPointOfArc(float radius, float start_angle, float end_angle){int N=100;if(start_angle<end_angle){float diff=end_angle-start_angle;for(int i=0;i<N;i++)arc.push_back(Point(radius*cos((start_angle+diff/N*i)/360.0*2*pi), radius*cos((start_angle+diff/N*i)/360.0*2*pi)));arc.push_back(Point(radius*cos(end_angle/360.0*2*pi),radius*sin(end_angle/360.0*2*pi)));//将圆弧终点加上}else{float diff=end_angle-start_angle+360.0f;for(int i=0;i<N;i++)arc.push_back(Point(radius*cos((start_angle+diff/N*i)/360.0*2*pi), radius*cos((start_angle+diff/N*i)/360.0*2*pi)));arc.push_back(Point(radius*cos(end_angle/360.0*2*pi),radius*sin(end_angle/360.0*2*pi)));//将圆弧终点加上}
}void Draw::drawArc(){glBegin(GL_LINE_STRIP);for(int i=0;i<arc.size();i++)glVertex3f(arc[i].x, arc[i].y, arc[i].z);glEnd();
}

需要特别注意的是,在计算好圆弧要绘制的点后一定要将圆弧终点的位置加上!这是由于在实际绘制中是无法绘制到终止角度的位置的(由于该点可能根本没有计算,for循环就结束了)。将圆弧终点加上后可以绘制出完整的圆弧。

对于适用性再说明一下:博主的示例程序适用于三维空间中的圆/圆弧的绘制,但是仅讨论了圆心在(0,0,0)处的情况,对于空间中任何一处的圆/圆弧的绘制实际上可以看作是先在圆心为(0,0,0)处的圆/圆弧的绘制,之后通过平移的方式将vector中保存的每个点平移到相应的位置进行绘制即可。

最后,本篇文章创作时间仓促,如有任何内容不妥,请与我联系!

OpenGL圆弧的绘制方法相关推荐

  1. Canvas 绘制方法过一遍

    Canvas 基础方法和参数介绍 save() restore() void enableZ() void disableZ() 绘制方法及参数介绍 1. drawARGB 画布颜色设置 void d ...

  2. Android使用NDK OpenGL ES3.0绘制一个三角形

    Android使用NDK  OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...

  3. android编程绘图,Android编程绘图操作之弧形绘制方法示例

    本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...

  4. 【OpenGL ES】绘制圆形

    1 前言 [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,[OpenGL ES]绘制正方形中介绍了绘制正方形的方法,本文将介绍绘制圆形的方法. OpenGL 以点.线段.三角形为图元,没有 ...

  5. Protel99 画层次原理图、多Part元件的绘制方法的一些心得记录

    1).在实际工作中我们可能需要把多张原理图连接起来,在同一PCB文件上进行绘制,具体操作步骤如 下: 1.首先要确保每张原理图都要放置互相连接的端口(即Port),相连的端口名称要一样. 2.新建一个 ...

  6. AutoCAD2013中曲线绘制方法

    说到曲线,它真的是非常重要,而且非常美观,有了它,可以让我们绘制的图纸更清晰.更美观,很多人特别是初学者往往对曲线的绘制方法掌握得不是很到位,今天我们就分享常见的曲线图形的绘制方法,希望可以对大家有所 ...

  7. SVG(可缩放矢量图形)基本图形绘制方法与path路径命令

    tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و SVG(Scalable Vector Graphics)可缩放矢量图形 用于描述二维矢量图形的一种图形格式 很早之前SVG就出 ...

  8. 【OpenGL ES】绘制正方形

    1 前言 [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,本文将介绍绘制正方形的方法. OpenGL 以点.线段.三角形为图元,没有提供绘制正方形内部的接口.要绘制正方形内部,必须通过三角 ...

  9. 《视觉开发专题》之 OpenGL 3D动画绘制图形学概念的理解

    知识前导 计算机图形学的终极目标--讨好人类视觉系统   最近在啃的书中有一本叫<计算机图形学 原理及实践>,这本书让我深有感触的是其绪论中对计算机构建真实感图像的理解:我们所致力的最终目 ...

最新文章

  1. 数学思想 —— 低维与高维的统一
  2. 在webstorm里面添加自定义web browsers的方法
  3. Notepad++如何编译、运行Java
  4. 玩法与叙事撕裂许久,3A与暴力却难分难舍
  5. 使用QT的一些小Tipster
  6. Redux初学者指南
  7. PRML-系列一之1.6.1
  8. 数据结构之基于Java的链接列表实现
  9. Java去除字符中的空格(trim)
  10. 深圳活用大数据提升气象服务
  11. Webtrends网站运营分析解决方案简介
  12. 关于保险的“损失补偿原则”
  13. ICP网站备案查询系统php版 v1.0+(源码)
  14. Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
  15. unity游戏破解 修改粒子材质
  16. 广交会创建直播间注意事项丨汇信外贸软件
  17. 在一次班会课上的讲话
  18. 《操作系统-真象还原》08. 内存管理系统
  19. 工程监测多通道振弦模拟信号采集仪VTN的通讯协议
  20. Drupal实战之--安装Drupal

热门文章

  1. 微信小程序云开发学习笔记No.03——(文件存储)
  2. Linux Centos8最小化安装,tab键无法使用解决方法
  3. 机器学习面试题41-60
  4. java面试你有什么需要问我们的吗_关于 Java 面试,你应该准备这些知识点
  5. 2023年二建报考条件是什么?考试考什么?来考网
  6. web测试之包含多个控件元素的注册页面,怎么进行快速测试?
  7. windows下运行python打印有颜色的字_在windows下Python打印彩色字体的方法
  8. MONEL 400(UNS N04400 / W.Nr. 2.4360/ 2.4361)机械性能
  9. 油烟净化器吱吱作响是什么原因?
  10. 重温Python基础,都是最基础的知识点