【OpenGL】绘制柱状图

1.绘制目标

  1. 理解物体坐标系、世界坐标系以及两者之间的关系,尝试使用glTranslate*()函数进行模型变换。
  2. 学会使用GL_TRIANGLE_STRIP绘制二维实体。
    在这里插入图片描述

2.核心代码

2.1 坐标轴

/// <summary>  
/// 坐标轴
/// </summary>  
/// <param name="x">向左平移</param>  
/// <param name="y">向下平移</param>  
void Draw_cross(double x, double y)  
{  
    glColor3f(0.f, 0.f, 0.f);       //设置RGB  
    glBegin(GL_LINES);              //画直线  
  
    //画十字  
    glVertex2f(-8.0f - x, 0.0f - y);  
    glVertex2f(8.0f - x, 0.0f - y);  
    glVertex2f(0.0f - x, 8.0f - y);  
    glVertex2f(0.0f - x, 0.0f - y);  
  
    //x轴的箭头  
    glVertex2f(7.7f - x, 0.3f - y);  
    glVertex2f(8.0f - x, 0.0f - y);  
    glVertex2f(7.7f - x, -0.3f - y);  
    glVertex2f(8.0f - x, 0.0f - y);  
  
    //y轴的箭头  
    glVertex2f(-0.2f - x, 7.5f - y);  
    glVertex2f(0.0f - x, 8.0f - y);  
    glVertex2f(0.2f - x, 7.5f - y);  
    glVertex2f(0.0f - x, 8.0f - y);  
  
    glEnd();  
}  

2.2 彩色矩形

/// <summary>  
/// 彩色矩形 
/// </summary>  
/// <param name="x">左上角点的X坐标</param>  
/// <param name="y">左上角点的Y坐标</param>  
/// <param name="width">矩形宽</param>  
/// <param name="height">矩形高</param>  
/// <param name="R">红色</param>  
/// <param name="G">绿色</param>  
/// <param name="B">蓝色</param>  
void Draw_block(double x, double y, double width, double height, double R, double G, double B)  
{  
    glColor3f(R, G, B);                         //设置RGB  
    glPointSize(1.f);  
    glBegin(GL_TRIANGLE_STRIP);                 //画矩形  
    glVertex2f(x, y);  
    glVertex2f(x, y - height);  
    glVertex2f(x + width, y);  
    glVertex2f(x + width, y - height);  
    glEnd();  
}  

3.全部代码

#define GLEW_STATIC
#define FREEGLUT_STATIC

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <GL/glext.h>
#include <iostream>
#include "main.h"

void init() {
	//全1未白色,全0为黑色
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

/// <summary>
/// 画十字
/// </summary>
/// <param name="x">向左平移</param>
/// <param name="y">向下平移</param>
void Draw_cross(double x , double y)
{
	glColor3f(0.f, 0.f, 0.f);		//设置RGB
	glBegin(GL_LINES);				//画直线
	
	//画十字
	glVertex2f(-8.0f - x, 0.0f - y);
	glVertex2f(8.0f - x, 0.0f - y);
	glVertex2f(0.0f - x, 8.0f - y);
	glVertex2f(0.0f - x, 0.0f - y);

	//x轴的箭头
	glVertex2f(7.7f - x, 0.3f - y);
	glVertex2f(8.0f - x, 0.0f - y);
	glVertex2f(7.7f - x, -0.3f - y);
	glVertex2f(8.0f - x, 0.0f - y);

	//y轴的箭头
	glVertex2f(-0.2f - x, 7.5f - y);
	glVertex2f(0.0f - x, 8.0f - y);
	glVertex2f(0.2f - x, 7.5f - y);
	glVertex2f(0.0f - x, 8.0f - y);

	glEnd();
}

/// <summary>
/// 绘制矩形
/// </summary>
/// <param name="x">左上角点的X坐标</param>
/// <param name="y">左上角点的Y坐标</param>
/// <param name="width">矩形宽</param>
/// <param name="height">矩形高</param>
/// <param name="R">红色</param>
/// <param name="G">绿色</param>
/// <param name="B">蓝色</param>
void Draw_block(double x, double y, double width, double height , double R, double G, double B)
{
	glColor3f(R, G, B);							//设置RGB
	glPointSize(1.f);
	glBegin(GL_TRIANGLE_STRIP);					//画矩形
	glVertex2f(x, y);
	glVertex2f(x, y - height);
	glVertex2f(x + width, y);
	glVertex2f(x + width, y - height);
	glEnd();
}

void display() {
	//当前可写的颜色缓冲
	glClear(GL_COLOR_BUFFER_BIT);

	// 画十字
	Draw_cross(0.5, 0);

	// 画方块
	Draw_block(-5.0, 1.2, 1.0, 1.2, 0.5, 0.5, 0.5);
	Draw_block(-3.0, 3.0, 1.0, 3.0, 1, 0, 1);
	Draw_block(-1.0, 5.6, 1.0, 5.6, 1, 0, 0);
	Draw_block(1.0, 6.7, 1.0, 6.7, 0, 1, 0);
	Draw_block(3.0, 4.7, 1.0, 4.7, 0, 0, 1);
	Draw_block(5.0, -1.5, 1.0, -1.5, 0.4, 0.8, 0.2);

	glutSwapBuffers();
}

void reshape(int w, int h) {
	//x[0,w],y[0,h]
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//投影区域
	gluOrtho2D(-8.f, 8.f, -8.f, 8.f);
}

int main(int argc, char** argv) {
	glutInit(&argc, argv);
	glutInitContextVersion(3, 3);
	glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(800, 600);
	glutCreateWindow("HellGL");
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glewExperimental = GL_TRUE;
	glewInit();
	init();
	glutMainLoop();
	return 0;
}

4.运行结果

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
OpenGL可以使用glBegin和glEnd函数来绘制矢量图形。在glBegin和glEnd之间,可以使用一系列的顶点坐标来定义图形的形状。例如,可以使用glBegin(GL_TRIANGLES)和glEnd()来绘制一个三角形。在glBegin和glEnd之间,使用glVertex2f函数来指定每个顶点的坐标。例如,glVertex2f(0.0f, 0.0f)表示三角形的一个顶点在坐标原点。可以使用glColor3f函数来指定每个顶点的颜色。例如,glColor3f(1.0f, 0.0f, 0.0f)表示红色。通过在glBegin和glEnd之间多次调用glVertex2f和glColor3f函数,可以绘制出复杂的矢量图形。\[1\] 另外,OpenGL还提供了glDrawPixels函数来绘制像素图像。glDrawPixels函数的参数包括图像的宽度、高度、像素数据内容和像素数据在内存中的格式。可以从BMP文件中读取像素数据,并使用glDrawPixels函数将像素图像绘制到屏幕上。在绘制像素图像之前,可以使用glRasterPos*函数来指定绘制像素图像的起始位置。\[2\] 总结起来,使用OpenGL绘制矢量图形可以通过glBegin和glEnd函数以及glVertex2f和glColor3f函数来定义图形的形状和颜色。而绘制像素图像可以使用glDrawPixels函数,并可以通过glRasterPos*函数来指定绘制位置。\[3\] #### 引用[.reference_title] - *1* *2* *3* [OpenGL像素操作](https://blog.csdn.net/weixin_34049948/article/details/93741898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值