【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就会报错 负数设置不进来.正数也设置不了 ...
随机推荐
- ZOJ 3057 Beans Game 博弈论 sg函数
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057 典型的sg函数,数据范围卡得真好啊 代码 #include<c ...
- BZOJ 3391 [Usaco2004 Dec]Tree Cutting网络破坏(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3391 [题目大意] 给定一棵树,求分支size均不大于一半点数的点 [题解] 递归的同 ...
- 【构造】Codeforces Round #405 (rated, Div. 1, based on VK Cup 2017 Round 1) A. Bear and Different Names
如果某个位置i是Y,直接直到i+m-1为止填上新的数字. 如果是N,直接把a[i+m-1]填和a[i]相同即可,这样不影响其他段的答案. 当然如果前面没有过Y的话,都填上0就行了. #include& ...
- CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...
- mysql错误 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)
mysql -u root -p Aaa111222333 grant all privileges on *.* to root@'%' identified by 'aaa111222333; Q ...
- subline text 常用插件
C语言 Alignment c Improved cool format doc Blocker cTags AllAutoComplete wakatime 精确统计你再 ...
- tomcat配置优化
tomcat服务管理页面 http://192.168.1.249:8080/manager/status 找到下面的内容 "http-nio-8081" (此处端口是根据自己实 ...
- C++与Flash的交互
研究Flash嵌入游戏中的可行性....... 渲染问题已解决 事件响应已解决 下面是C++与Flash AS的交互, 以MFC为例: 1. 新建一个MFC Dialog程序 2. 添加一个Flash ...
- JAVA常见算法题(二十九)
package com.forezp.util; import java.util.Scanner; /** * 判断输入的5个字符串的最大长度,并输出 * * * @author Administr ...
- 利用Python编写网络爬虫下载文章
#coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期 ...