【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)
今天封装了一个Line类。负责在昨天写的窗体上绘制线条。
OpenGL画图是通过给glBegin函数设置參数达成的,绘制线条有三个不同的參数:
GL_LINES : 绘制连接两个点的线段(绘制的端点位于glBegin函数与glEnd函数之间)
GL_LINE_STRIP : 绘制首尾相连的折线
GL_LINE_LOOP : 绘制首尾相连的折线,并在最后将起始点与终点相连接。闭合路径
以下是Line类的代码:
/***********************************************
文件名称:Line.h
功能:画布。在上面能够画点,画线条和椭圆、矩形
************************************************/
#ifndef _LINE_H_
#define _LINE_H_
#include "Point.h"
#include "Window.h"
class Line : public Object {
public:
Line(){
this->mode = this->LINE_MODE_DEFAULT;
this->status = this->LINE_INIT;
}
//起始点,每次设置起始点。都需同一时候记录此时是起始点状态。若此时已是起始点
//则删除上一个起始点
void moveTo(Point& p){
if(this->status == this->LINE_START) {
points.pop_back();
return;
}
points.push_back(p);
this->status = this->LINE_START;
}
//画线终止点,若一開始是终止点。不允加入
void LineTo(Point& p){
if (this->status == this->LINE_START) {
this->points.push_back(p);
this->status = this->LINE_END;
return;
}
}
//加入节点数组
void addPoints(Point* p,int size) {
for (int i = 0; i < size; i++){
this->points.push_back(p[i]);
}
}
//设置线条颜色
void setColor(Color& color){
this->color = color;
}
//设置画线模式
void setMode(int mode){
switch (mode){
case LINE_MODE_DEFAULT:
mode = GL_LINES; break;
case LINE_MODE_LOOP:
mode = GL_LINE_LOOP; break;
case LINE_MODE_NOTLOOP:
mode = GL_LINE_STRIP; break;
}
this->mode = mode;
}
public:
static const int LINE_MODE_LOOP = 0; //设定线条首尾相接
static const int LINE_MODE_NOTLOOP = 1; //不设定线条首尾相接
static const int LINE_MODE_DEFAULT = 2; //默认绘制线段
private:
//画线状态
static const int LINE_INIT = 0; //初始状态
static const int LINE_START = 1; //起始点状态
static const int LINE_END = 2; //终止点状态
private:
int mode; //画线模式,默觉得不连接
vector<Point> points; //点集合
int status; //画线状态
Color color; //指定颜色
public:
void show(){//将被Window调用画图虚函数
glColor3f(color.R, color.G, color.B);
glBegin(mode);
for (int i = 0; i < points.size(); i++) {
glVertex2i(points[i].X, points[i].Y);
}
glEnd();
}
};
#endif
以下画了一个五角星的实例:
(里面的Window和Application、Point类在博客(一))
#include "Window.h"
#include "Application.h"
#include "Line.h"
//隐藏控制台窗体
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int main(int argc ,char* argv[]) {
int w = 400, h = 300;
Window window(string("Hello"), 100, 100, w, h);
window.create();
Line line;
//画五角星
line.setMode(line.LINE_MODE_LOOP);
Point p[5] = {
Point(10, 200),
Point(200, 200),
Point(30, 20),
Point(105, 240),
Point(180, 20),
};
line.setColor(Color(255, 0, 0));
line.addPoints(p, 5);
window.add(&line); Application* app = new Application();
app->init(argc, argv);
app->add(window);
app->show(); delete app;
return 0;
} //*/
效果图:
这里直接使用了OpenGL的画线函数。用于绘制直线的计算机图形学算法有DDA算法和Bresenham算法等。
【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)的更多相关文章
- 小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助
小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧 ...
- ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明
说明 这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用 新建工程 安装MQTT的jar包 implementation 'org.eclipse.paho:org.e ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- JavaSE基础篇—流程控制语句—方法的定义 调用和重载
1.定义方法 是封装在一起来执行操作语句的集合,用来完成某个功能操作,简单的说就是提取出来的有特定功能的代码(程序).在某些语言中被称为函数或者过程,比较特殊的方法是main方法(主方法),main方 ...
- Java入门到精通——基础篇之面向对象
一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...
- python基础篇_006_面向对象
面向对象 1.初识类: # 定义一个函数,我们使用关键字 def """ def 函数名(参数): '''函数说明''' 函数体 return 返回值 "&qu ...
- 阶段1 语言基础+高级_1-2 -面向对象和封装_16this关键字的作用
this主要是在重名的情况下 ,起到区分的效果 新建demo04的包,里面新建类Person 通过this.进行区分 this关键字可以解决重名 分不开的问题 这里的person调用的sayHello ...
- 阶段1 语言基础+高级_1-2 -面向对象和封装_15练习使用private关键字定义
练习使用private关键字定义一个学生类.通过这个联系说明一种特殊情况 先定义了name个age分别再定义getter和setter的方法 boolean类型的getter方法不能叫做get开头的. ...
- 阶段1 语言基础+高级_1-2 -面向对象和封装_14private关键字的作用及使用
新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...
随机推荐
- [Agc008F]Black Radius
[AGC008F] Black Radius Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息 ...
- 【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
题意:给你一个凸多边形,和多次询问,每次询问给你一条直线,问你这条直线与凸包上的顶点的最近距离是多少. 记当前询问的直线的斜率为K, 先找到与这条直线距离最远的两个点: 就把凸包所有的边当做有向直线进 ...
- [USACO13NOV]No Change
题目大意: 你有k(k<=16)个硬币,每个硬币都有自己的面值. 现在你要给n件商品付钱,每件商品也有自己的价格. 然而老板是个奸商,他绝对不会给你找钱. 你每次付钱只能用一个硬币,但是你可以一 ...
- Problem F: 零起点学算法101——统计字母数字等个数
#include<stdio.h> #include<string.h> int main(){ ]; while(gets(str)!=NULL){ ,b=,c=,d=; ; ...
- redis源码解析之事件驱动
Redis 内部有个小型的事件驱动,它主要处理两项任务: 文件事件:使用I/O多路复用技术处理多个客户端请求,并返回执行结果. 时间事件:维护服务器的资源管理,状态检查. 主要的数据结构包括文件事件结 ...
- 5分钟上手TypeScript
安装TypeScript 安装这个工具有两种方式: 用npm安装npm install -g typescript 安装visual studio的TypeScript插件 编译TypeScript ...
- ElasticSearch安装为Windows服务
目前我都是在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch 这样直接启动的话集 ...
- NAND Flash大容量存储器K9F1G08U的坏块管理方法
转: http://www.360doc.com/content/11/0915/10/7715138_148381804.shtml 在进行数据存储的时候,我们需要保证数据的完整性,而NAND Fl ...
- windows 配置环境变量快捷方式
在 Windows 设置环境变量 在环境变量中添加软件A的目录: 在命令提示框中(cmd) : 输入 path %path%;C:\A, 按下"Enter". 注意: C:\A是软 ...
- 七.使用fastJson解析器
1.到入jar包 <!-- 添加fastjson 依赖包. --> <dependency> <groupId>com.alibaba</groupId> ...