【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就会报错 负数设置不进来.正数也设置不了 ...
随机推荐
- 【UOJ #131】【NOI 2015】品酒大会
http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...
- 【hihoCoder 第133周】【hihoCoder 1467】2-SAT·hihoCoder音乐节
http://hihocoder.com/problemset/problem/1467 2-sat模板...详细的题解请看题目里的提示. tarjan模板打错again致命伤qwq #include ...
- sg函数总结
http://blog.csdn.net/luomingjun12315/article/details/45555495 这一段时间写的题和我接下来要展示的一些概念都来自这里↑. 必胜点和必败点的概 ...
- python 多继承详解
class A(object): # A must be new-style class def __init__(self): print "enter A" print &qu ...
- BigInt的实现——C++编程风格读书笔记
C++编程风格这本书前面一些章节都觉得很简明易懂,但是读到效率这一章是才充分认识到读别人的代码还是很痛苦的一件事.书中给出的需要改进的初始类如下: class BigInt { private: ch ...
- Problem G: 十进制数转换为二进制数
#include<stdio.h> int main() { ]; while(scanf("%d",&n)!=EOF) { ; ) { a[i++]=n%; ...
- Educational Codeforces Round 9 E. Thief in a Shop dp fft
E. Thief in a Shop 题目连接: http://www.codeforces.com/contest/632/problem/E Description A thief made hi ...
- [典型漏洞分享]一个典型的XSS盲打漏洞可导致全网用户cookie被盗取
偶平时在做安全测试时,一般是以发现问题为主,点到为止,但做安全的同学可能也遇到过这样的问题,当你尝试向开发的同学描述一个漏洞危害怎么怎么样的时候,双方经常会有一种鸡同鸭讲的感觉,甚至他们觉得我们在夸大 ...
- jQuery: on()特别的几种用法
jQuery大家肯定用得非常的熟练了,没什么好讲的,今天为什么要写关于on这个事件绑定的API?主要还是因为看了大神的博文:web移动端浮层滚动阻止window窗体滚动JS/CSS处理;其中对于on用 ...
- 微服务:spring-cloud-archaius 起步
原文:http://blog.csdn.net/qq_18675693/article/details/53337941 微服务:spring-cloud-archaius 起步 原创 2016年11 ...