OpenGL圆弧的绘制方法
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圆弧的绘制方法相关推荐
- Canvas 绘制方法过一遍
Canvas 基础方法和参数介绍 save() restore() void enableZ() void disableZ() 绘制方法及参数介绍 1. drawARGB 画布颜色设置 void d ...
- Android使用NDK OpenGL ES3.0绘制一个三角形
Android使用NDK OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...
- android编程绘图,Android编程绘图操作之弧形绘制方法示例
本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...
- 【OpenGL ES】绘制圆形
1 前言 [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,[OpenGL ES]绘制正方形中介绍了绘制正方形的方法,本文将介绍绘制圆形的方法. OpenGL 以点.线段.三角形为图元,没有 ...
- Protel99 画层次原理图、多Part元件的绘制方法的一些心得记录
1).在实际工作中我们可能需要把多张原理图连接起来,在同一PCB文件上进行绘制,具体操作步骤如 下: 1.首先要确保每张原理图都要放置互相连接的端口(即Port),相连的端口名称要一样. 2.新建一个 ...
- AutoCAD2013中曲线绘制方法
说到曲线,它真的是非常重要,而且非常美观,有了它,可以让我们绘制的图纸更清晰.更美观,很多人特别是初学者往往对曲线的绘制方法掌握得不是很到位,今天我们就分享常见的曲线图形的绘制方法,希望可以对大家有所 ...
- SVG(可缩放矢量图形)基本图形绘制方法与path路径命令
tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و SVG(Scalable Vector Graphics)可缩放矢量图形 用于描述二维矢量图形的一种图形格式 很早之前SVG就出 ...
- 【OpenGL ES】绘制正方形
1 前言 [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,本文将介绍绘制正方形的方法. OpenGL 以点.线段.三角形为图元,没有提供绘制正方形内部的接口.要绘制正方形内部,必须通过三角 ...
- 《视觉开发专题》之 OpenGL 3D动画绘制图形学概念的理解
知识前导 计算机图形学的终极目标--讨好人类视觉系统 最近在啃的书中有一本叫<计算机图形学 原理及实践>,这本书让我深有感触的是其绪论中对计算机构建真实感图像的理解:我们所致力的最终目 ...
最新文章
- 数学思想 —— 低维与高维的统一
- 在webstorm里面添加自定义web browsers的方法
- Notepad++如何编译、运行Java
- 玩法与叙事撕裂许久,3A与暴力却难分难舍
- 使用QT的一些小Tipster
- Redux初学者指南
- PRML-系列一之1.6.1
- 数据结构之基于Java的链接列表实现
- Java去除字符中的空格(trim)
- 深圳活用大数据提升气象服务
- Webtrends网站运营分析解决方案简介
- 关于保险的“损失补偿原则”
- ICP网站备案查询系统php版 v1.0+(源码)
- Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
- unity游戏破解 修改粒子材质
- 广交会创建直播间注意事项丨汇信外贸软件
- 在一次班会课上的讲话
- 《操作系统-真象还原》08. 内存管理系统
- 工程监测多通道振弦模拟信号采集仪VTN的通讯协议
- Drupal实战之--安装Drupal
热门文章
- 微信小程序云开发学习笔记No.03——(文件存储)
- Linux Centos8最小化安装,tab键无法使用解决方法
- 机器学习面试题41-60
- java面试你有什么需要问我们的吗_关于 Java 面试,你应该准备这些知识点
- 2023年二建报考条件是什么?考试考什么?来考网
- web测试之包含多个控件元素的注册页面,怎么进行快速测试?
- windows下运行python打印有颜色的字_在windows下Python打印彩色字体的方法
- MONEL 400(UNS N04400 / W.Nr. 2.4360/ 2.4361)机械性能
- 油烟净化器吱吱作响是什么原因?
- 重温Python基础,都是最基础的知识点