目录

  • 前言
  • 一、核心思路
  • 二、源码
  • 三、其他小知识

前言

初学计算机图形学以及VS、OpenGL,只作为参考,无权威性可言,有问题欢迎大家在评论区提出,如果帮到你了,可以留个点赞再走。

一、核心思路

五角星的十个顶点由同心圆的十个顶点构成。通过同心圆的圆心坐标、大圆半径R、小圆半径r计算出十个顶点的坐标,然后通过绘制线段/三角形来绘制五角星。(计算比较简单,根据下图即可计算出十个顶点的坐标,这里就省略了)

二、源码

#include <GL/glew.h>//OpenGL扩展库
#include <GL/glut.h>//OpenGL工具库
#include <stdio.h>
#include <math.h>// 绘制五角星核心思路:求出五角星的十个顶点再通过绘制线段/三角形连接起来即可// 定义Π
#define PI 3.14159265// 定义坐标结构体
struct Vertex {double x;double y;
};// 绘制线段函数
void drawLine(Vertex Vertex_Fir, Vertex Vertex_Sec) {// 设置颜色glColor3f(1, 0, 0);// 设置绘制类型glBegin(GL_LINES);// 第一个坐标glVertex2f(Vertex_Fir.x, Vertex_Fir.y);// 第二个坐标glVertex2f(Vertex_Sec.x, Vertex_Sec.y);glEnd();
}// 绘制红色三角形函数
void drawRedTriangle(Vertex Vertex_Fir, Vertex Vertex_Sec, Vertex Vertex_Thi) {// 设置填充的颜色glColor3f(1, 0, 0);// 设置绘制类型glBegin(GL_TRIANGLES);// 第一个坐标glVertex2f(Vertex_Fir.x, Vertex_Fir.y);// 第二个坐标glVertex2f(Vertex_Sec.x, Vertex_Sec.y);// 第三个坐标glVertex2f(Vertex_Thi.x, Vertex_Thi.y);glEnd();
}// 绘制蓝色三角形函数
void drawBlueTriangle(Vertex Vertex_Fir, Vertex Vertex_Sec, Vertex Vertex_Thi) {// 设置填充的颜色glColor3f(0, 0, 255);//深蓝色// 设置绘制类型glBegin(GL_TRIANGLES);// 第一个坐标glVertex2f(Vertex_Fir.x, Vertex_Fir.y);// 第二个坐标glVertex2f(Vertex_Sec.x, Vertex_Sec.y);// 第三个坐标glVertex2f(Vertex_Thi.x, Vertex_Thi.y);glEnd();
}// 获取外圆五角星的五顶点(参数:大圆圆心坐标以及半径)
Vertex* getExternalVertex(Vertex Center_Vertex, double R) {// 定义Vertex结构体数组,包括五个顶点和一个圆心Vertex* externalVertex = new Vertex[6];double alpha = 2*PI / 5;double thet = PI / 10;double bet = 2*PI / 10;// 圆心坐标externalVertex[0].x = Center_Vertex.x, externalVertex[0].y = Center_Vertex.y;// 其余五个顶点externalVertex[1].x = Center_Vertex.x, externalVertex[1].y = Center_Vertex.y+R;externalVertex[2].x = Center_Vertex.x+R*cos(thet), externalVertex[2].y = Center_Vertex.y+R*sin(thet);externalVertex[3].x = Center_Vertex.x+R*sin(bet), externalVertex[3].y = Center_Vertex .y-R*cos(bet);externalVertex[4].x = Center_Vertex.x-R*sin(bet), externalVertex[4].y = Center_Vertex.y-R*cos(bet);externalVertex[5].x = Center_Vertex.x-R*cos(thet), externalVertex[5].y = Center_Vertex.y+R*sin(thet);return externalVertex;
}// 获取内圆五角星的五顶点(参数:小圆圆心坐标以及半径)
Vertex* getInternalVertex(Vertex Center_Vertex, double r) {// 定义Vertex结构体数组,包括五个顶点和一个圆心Vertex* internalVertex = new Vertex[6];double alpha = 2 * PI / 5;double thet = PI / 10;double bet = (PI-alpha) / 2;// 圆心坐标internalVertex[0].x = Center_Vertex.x, internalVertex[0].y = Center_Vertex.y;// 其余五个顶点internalVertex[1].x = Center_Vertex.x + r * cos(bet), internalVertex[1].y = Center_Vertex.y + r * sin(bet);internalVertex[2].x = Center_Vertex.x + r * cos(thet), internalVertex[2].y = Center_Vertex.y - r * sin(thet);//internalVertex[3].x = Center_Vertex.x, internalVertex[3].y = Center_Vertex.y - r;//internalVertex[4].x = Center_Vertex.x - r * cos(thet), internalVertex[4].y = Center_Vertex.y - r * sin(thet);internalVertex[5].x = Center_Vertex.x - r * cos(bet), internalVertex[5].y = Center_Vertex.y + r * sin(bet);return internalVertex;
}// 设置背景颜色
void setBackgroundColor(void) {glClearColor(0.2, 0.3, 0.3, 0.5);
}// 绘制五角星
void draw(void) {// 清除清缓存glClear(GL_COLOR_BUFFER_BIT);// ### 绘制线框五角星 ###// 1. 定义圆心、大小圆半径Vertex Center_Vertex;Center_Vertex.x = 500, Center_Vertex.y =150;//圆心以显示窗口的左下角为原点,向右x轴正方向,向上y轴正方向double R = 100;double r = 40;// 2. 获取内外顶点Vertex* externalVertex = getExternalVertex(Center_Vertex, R);Vertex* internalVertex = getInternalVertex(Center_Vertex, r);// 3. 绘制线框五角星for (int i = 1; i < 6; i++) {drawLine(externalVertex[i], internalVertex[i]);if (i < 5) {drawLine(internalVertex[i], externalVertex[i + 1]);}else {drawLine(internalVertex[i], externalVertex[1]);}}// ### 绘制红色五角星 ###// 1. 定义圆心、大小圆半径Center_Vertex.x = 500, Center_Vertex.y = 350;R = 100, r = 40;// 2. 获取内外顶点externalVertex = getExternalVertex(Center_Vertex, R);internalVertex = getInternalVertex(Center_Vertex, r);// 3. 绘制红色五角星for (int i = 1; i < 6; i++) {drawRedTriangle(Center_Vertex, internalVertex[i], externalVertex[i]);if (i < 5) {drawRedTriangle(Center_Vertex, internalVertex[i], externalVertex[i+1]);}else {drawRedTriangle(Center_Vertex, internalVertex[i], externalVertex[1]);}}// ### 绘制多色五角星 ###// 1. 定义圆心、大小圆半径Center_Vertex.x = 500, Center_Vertex.y = 550;R = 100, r = 40;// 2. 获取内外顶点externalVertex = getExternalVertex(Center_Vertex, R);internalVertex = getInternalVertex(Center_Vertex, r);// 3. 绘制多色五角星for (int i = 1; i < 6; i++) {// 绘制红色三角形drawRedTriangle(Center_Vertex, internalVertex[i], externalVertex[i]);// 绘制蓝色三角形if (i < 5) {drawBlueTriangle(Center_Vertex, internalVertex[i], externalVertex[i + 1]);}else {drawBlueTriangle(Center_Vertex, internalVertex[i], externalVertex[1]);}}glutSwapBuffers();//交换缓冲(双缓冲时使用)
}void reshape(int width, int height)
{glViewport(0, 0, width, height);//设置视区glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, width, 0, height);//设置图形数据范围glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}int main() {// 窗口的坐标是电脑屏幕左上角为原点,向右为x轴正方向;向下为y轴正方向glutInitWindowPosition(100, 100); //定义窗口位置与大小glutInitWindowSize(1200, 700);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); //初始化显示模式glutCreateWindow("五角星"); //定义窗口名称setBackgroundColor(); // 设置背景色glutDisplayFunc(draw); //图形绘制函数glutReshapeFunc(reshape); //窗口重绘函数glutMainLoop(); //无限循环函数 return 0;
}

三、其他小知识

  1. 定义显示窗口位置与大小时:参考坐标系是电脑屏幕左上角为原点,向右为x轴正方向;向下为y轴正方向

  2. 绘制图形时使用的坐标:参考坐标系是显示窗口的左下角为原点,向右x轴正方向,向上y轴正方向

VS-openGL 绘制五角星相关推荐

  1. 计算机图形学五角星c语言,计算机图形学实验——利用OpenGL函数绘制五角星

    一.实验名称:五角星的绘制 二.实验目的:了解 OpenGL 程序设计结构,掌握编程环 三.境的设置,掌握绘制线段的方法. 四.实验内容: 1.在 VC++ 环境下 ,练习利用 OpenGL 绘制三角 ...

  2. c语言 opengl画仪表盘源码,opengl绘制五星红旗

    本文实例为大家共享了opengl绘制五星红旗的详细代码,供大家参考,详细内容如下 主要仪器设备 VisualStudio C++2015 Windows 10环境 opengl库 操作步骤 1.五星红 ...

  3. 【青少年编程】绘制五角星

    Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复[Scratch],即可进入. 如果加入了之前的社群不需要重复加入. 类比思维就是指把两个或者两类事物进行比较,并进行逻辑推理 ...

  4. 如何用 OpenGL 绘制雪花?

    作者 | 许向武 责编 | 张红月 出品 | CSDN博客 看冬奥才知道,阿勒泰不但是中国的"雪都",还是"人类滑雪起源地".这个说法是否成立,姑且不论,阿勒泰 ...

  5. 使用OpenGL绘制圆环体(Torus)

    本篇介绍一下使用OpenGL绘制圆环体的方法.程序是在C#和OpenTK环境下编译的. 代码: /// <summary> /// 绘制圆环体 /// </summary> / ...

  6. python画五角星-Python第八课 绘制五角星1.0

    第八课 绘制五角星1.0 学习目标: 1. 了解并学会使用turtle库. 2. 复习while循环. 教学重难点: turtle库的使用. 学习内容: 案例2: 使用turtle 库在Python中 ...

  7. 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )

    文章目录 一.绘制三角形 二.三角形绘制顺序 1.绘制正面 2.三个点逆时针方向排列 3.三个点顺时针方向排列 4.设置点的正面方向 三.绘制多个三角形 四.相关资源 一.绘制三角形 三角形绘制即绘制 ...

  8. 【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )

    文章目录 一.绘制单个点 二.绘制多个点 三.相关资源 在上一篇博客 [OpenGL]十.OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | ...

  9. 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )

    文章目录 一.初始化 OpenGL 矩阵 1.设置投影矩阵 2.设置模型视图矩阵 二.绘制点 1.清除缓冲区 2.设置当前颜色值 3.设置绘制点的大小 4.绘制点 5.将缓冲区绘制到前台 三.部分代码 ...

最新文章

  1. 域控制器安装完成没有_tcp_udp_Windows 安装 Jupyter Lab
  2. 【题解】hdu 3586 Information Disturbing 二分 树形dp
  3. 在继承类中,父类在子类中初始化问题,已解决
  4. codeforces gym-101741 Elevator 动态规划、单调队列
  5. elementui组件_elementui 中 loading 组件源码解析(续)
  6. ASCII码判断大小
  7. 部署项目在Tomcat出现,tomcat报错More than one fragment with the name [org_apache_tomcat_websocket]
  8. 切换IP配置的bat批处理命令
  9. linux更改jdk版本
  10. uva_10066 The Twin Towers
  11. html动态图片怎么设背景,微信8.0状态背景视频怎么设置?状态视频动态背景图设置教程[多图]...
  12. RT-Thread Studio 字体放大 缩小快捷键
  13. 注册商标的流程及费用是怎样的?
  14. 小额支付管理平台的设计与实现
  15. Win11安装虚拟机出现电脑蓝屏解决方案
  16. CNCF对象存储工具之MinIO:3:客户端mc安装与设定
  17. 苹果IWatch真香,包邮送一个!
  18. Chrome的HTTPS安全站点标志将于今年9月停用
  19. win7系统提示0x80070035找不到网络路径
  20. Multi-view graph convolutional networks with attention mechanism

热门文章

  1. 关于mini2440LCD模块总结
  2. Jquery判断元素是否包含在数组中$.inArray()
  3. php配置辨别图片形式,基于OpenCV的PHP图像人脸辨别技术(转载)
  4. 京东考试题目答案,每次顺序都不一样,一气之下,全部复制出来,满分过
  5. 无法找到该页您正在搜索的页面可能已经删除、更名或暂时不可用。HTTP 错误 404 - 文件或目录未找到。
  6. android2.2智能手机,向2.3看齐 Android 2.2智能手机盘点
  7. 服务器事件显示热修补,2019绝地求生4月3日更新提示服务器繁忙怎么办?
  8. linux操作系统测试面试题,软件测试进阶面试题之Linux基础
  9. 新人小白如何选择编程语言和开发方向(非常详细)初学者避坑指南!!
  10. 打个招呼~ 就~ 跑