今天封装了一个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函数(二)的更多相关文章

  1. 小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

    小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧 ...

  2. ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明

    说明 这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用 新建工程 安装MQTT的jar包 implementation 'org.eclipse.paho:org.e ...

  3. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  4. JavaSE基础篇—流程控制语句—方法的定义 调用和重载

    1.定义方法 是封装在一起来执行操作语句的集合,用来完成某个功能操作,简单的说就是提取出来的有特定功能的代码(程序).在某些语言中被称为函数或者过程,比较特殊的方法是main方法(主方法),main方 ...

  5. Java入门到精通——基础篇之面向对象

    一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...

  6. python基础篇_006_面向对象

    面向对象 1.初识类: # 定义一个函数,我们使用关键字 def """ def 函数名(参数): '''函数说明''' 函数体 return 返回值 "&qu ...

  7. 阶段1 语言基础+高级_1-2 -面向对象和封装_16this关键字的作用

    this主要是在重名的情况下 ,起到区分的效果 新建demo04的包,里面新建类Person 通过this.进行区分 this关键字可以解决重名 分不开的问题 这里的person调用的sayHello ...

  8. 阶段1 语言基础+高级_1-2 -面向对象和封装_15练习使用private关键字定义

    练习使用private关键字定义一个学生类.通过这个联系说明一种特殊情况 先定义了name个age分别再定义getter和setter的方法 boolean类型的getter方法不能叫做get开头的. ...

  9. 阶段1 语言基础+高级_1-2 -面向对象和封装_14private关键字的作用及使用

    新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...

随机推荐

  1. 【动态规划】Gym - 101201A - Alphabet

    题意:一个字符串被定义为“alphabetical”,当且仅当它能够删除一些字符,变成“ab...yz”,给你一个只由小写字母组成的字符串,问你最少插入几个字母,使它变成“alphabetical”的 ...

  2. 【模拟退火】poj2420 A Star not a Tree?

    题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点. 模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解.移动的过程中温度缓慢降低,接受更劣解的概率降低. 在网上看到的 ...

  3. 5分钟上手TypeScript

    安装TypeScript 安装这个工具有两种方式: 用npm安装npm install -g typescript 安装visual studio的TypeScript插件 编译TypeScript ...

  4. 使用hosts.allow和hosts.deny实现简单的防火墙

    说明:我建议学习防火墙只单一学习一种就够了,这种方式虽然简单和快速,但也有些不太灵活,所以如果要深入防火墙建议转iptables  一.背景简介 在Linux上多用iptables来限制ssh和tel ...

  5. HDU 4642 Fliping game (2013多校4 1011 简单博弈)

    Fliping game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. Eclipse使用maven创建struct2项目及遇到的各种坑

    参考创建教程:http://www.jb51.net/article/45138.htm   坑一: Eclipse创建maven项目报错:Could not resolve archetype or ...

  7. Nao 类人机器人,Aldebaran Robotics公司

    Nao 类人机器人,Aldebaran Robotics 公司,被SOFTBANK 收购,阿里巴巴.富士康参股. https://www.aldebaran.com/en   一家法国的公司. htt ...

  8. 未能加载文件或程序集 Version Culture=neutral, PublicKeyToken=

    最近项目报错 未能加载文件或程序集"Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, ...

  9. 【转载】【Todo】银弹与我们的职业

    看到一段文字,不得不单独拎出来. 然后再借用一下g9老大的<银弹和我们的职业>中的话: 银弹和我们的职业发展有什么相干?很简单:我们得把时间用于学习解决本质困难.新技术给高手带来方便.菜鸟 ...

  10. Linux内核开发者峰会照的全家福

    刚才看到一张Linux内核开发者峰会照的全家福,有历史价值,给大家分享一下.上面有Torvalds(大致在中间).Andrew Morton(目前的内核主要维护者,第二排右数第二个).Alan Cox ...