OpenGL 3:画圆
这次使用OpenGL画圆,而且中间画一个实心的五角星。
1. 画实心五角:
由于之前使用Polygen画会出现故障,或许是各个GPU硬件也会不一样的,所以使用Polygen画实心五角星并不可靠;
所以这里直接使用三角形画出五角星,不须要Polygen。
2 画圆
由于GLEW里面没有现成的圆形,所以仅仅能使用人工定顶点,然后画圆的方法;
当中的数学原理能够參考这里:http://slabode.exofire.net/circle_draw.shtml
最后得到效果:
非常美丽,非常标准的五角星外加一个圆形。
注:本程序仅仅使用Vertex Buffer,没使用Index Buffer
#pragma once
#include <stdio.h>
#include <GL\glew.h>
#include <GL\freeglut.h>
#include "math_3d.h"
#include <cmath> namespace Tutorial2_Tri_pentagram
{
GLuint VBO;
const static float PI = 3.1415926f;
const static double toPI = PI/180.0;
const static double penR = 0.8;
const static double penInR = penR * sin(18.0*toPI) / sin(126.0*toPI); void DrawCircle(Vector3f *vers, int offset,
float cx, float cy, float r, int num_segments)
{
for(int i = 0; i < num_segments; i++)
{
//get the current angle
float theta = 2.0f * PI * float(i) / float(num_segments); float x = r * cosf(theta);//calculate the x component
float y = r * sinf(theta);//calculate the y component vers[offset+i] = Vector3f(x + cx, y + cy, 0.0f);//output vertex
}
} void createGeometry()
{
Vector3f vers[10]; for (int i = 0, k = 0; i < 10; i+=2, k++)
{
vers[i].x = (float)(penR * cos((18.0+72.0*k)*toPI));
vers[i].y = (float)(penR * sin((18.0+72.0*k)*toPI));
vers[i].z = 0.0f;
vers[i+1].x = (float)(penInR * cos((72.0*k+54.0)*toPI));
vers[i+1].y = (float)(penInR * sin((72.0*k+54.0)*toPI));
vers[i+1].z = 0.0f;
} Vector3f vers2[412] =
{
vers[0], vers[4], vers[5], vers[0], vers[5], vers[6],
vers[2], vers[6], vers[7], vers[2], vers[7], vers[8]
};
DrawCircle(vers2, 12, 0.0f, 0.0f, (float)penR, 400); glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vers2), vers2, GL_STATIC_DRAW);
} static void renderScene()
{
glClear(GL_COLOR_BUFFER_BIT); glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, 12);
glDrawArrays(GL_LINE_LOOP, 12, 400); glDisableVertexAttribArray(0); glutSwapBuffers();
} void initCallBack()
{
glutDisplayFunc(renderScene);
} int run(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(800, 600);
glutInitWindowPosition(50, 50);
glutCreateWindow("Bill's Another Pentagram"); initCallBack(); GLenum res = glewInit();
if (res != GLEW_OK)
{
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
} createGeometry(); glClearColor(0.0f, 0.6f, 0.2f, 0.0f); glutMainLoop(); return 0;
}
}
OpenGL 3:画圆的更多相关文章
- 【openGL】画圆
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 【openGL】画五角星
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
- ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆
一.前言 吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半 ...
- canvas入门(画圆)
1.想在H5上画一个canvas,必须在页面上你需要的地方添加canvas标签, <canvas id="myCanvas"></canvas> 接着需 ...
- javascript画直线和画圆的方法(非HTML5的方法)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【液晶模块系列基础视频】4.1.X-GUI图形界面库-画线画圆等函数简介
[液晶模块系列基础视频]4.1.X-GUI图形界面库-画线画圆等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地 ...
随机推荐
- [Everyday Mathematics]20150112
设 $f\in C[0,1]$ 适合 $$\bex \int_x^1 f(t)\rd t\geq \frac{1-x^2}{2},\quad \forall\ x\in [0,1]. \eex$$ 试 ...
- <转>数据库设计的三大范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- KindEditor Asp.net
最近在使用KindEditor,其中遇到三个问题: 1.textarea添加 runat="server" 后整个editor在运行的时候不能显示出来,我没找到原因,于是我就把ru ...
- PHP $_SERVER的详细参数及说明
$_SERVER['PHP_SELF']#当前正在执行脚本的文件名,与documentroot相关. $_SERVER['argv']#传递给该脚本的参数. $_SERVER['argc']#包含传递 ...
- SVM:从理论到OpenCV实践
(转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 参考网友的博客: (1)[理论]支持向量机1: Maximum Marg ...
- nodejs学习笔记之mongoDB
这两天在学习nodejs,但是发现那本书nodejs入门指南上所用的好多方法都报错. 这里主要说下数据库部分 关于注册部分:书上创建数据库那里可能要小心点,用户名不存在的时候,下面调用save的对象要 ...
- 团 大连网赛 1007 Friends and Enemies
//大连网赛 1007 Friends and Enemies // 思路:思路很棒! // 转化成最大二分图 // 团:点集的子集是个完全图 // 那么朋友圈可以考虑成一个团,原题就转化成用团去覆盖 ...
- 瞬间从IT屌丝变大神——HTML规范
HTML规范包含以下内容: DTD统一用<!DOCTYPE HTML PUBLIC "_//W3C//DTD XHTML 1.0 Transitional//EN"" ...
- nodejs+express +jade模板引擎 新建项目
先 安装 nodejsiDEAAM 2015/7/16 22:47:25然后安装 npm install expressiDEAAM 2015/7/16 22:47:35然后安装 npm instal ...
- 现代程序设计homework——04
题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...