今天封装了一个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算法等。

转载于:https://www.cnblogs.com/gcczhongduan/p/5340367.html

【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)相关推荐

  1. Selenium基础篇之屏幕截图方法

    文章目录 前言 一.用途 1.捕获页面错误 2.调试测试用例 3.展示测试结果 4.记录页面状态 二.方法 1. save_screenshot 2. get_screenshot_as_file 3 ...

  2. 基于c++和asio的网络编程框架asio2教程基础篇:2、各个回调函数的触发顺序和执行流程

    基于c++和asio的网络编程框架asio2教程基础篇:2.各个回调函数的触发顺序和执行流程 以tcp举例: tcp服务端流程: #include <asio2/asio2.hpp>int ...

  3. OpenGL: 基础篇

    本人水平有限,如有问题请以文章形式提出,大家可以讨论吗... [OPENGL怎么用] OPENGL编程类似C编程,实际接口就是C,所以熟悉C是必要的 一般编程可用到的函数库包括: OPENGL实用库: ...

  4. Java基础篇——三大特性(封装)

    Java三大特性我会用自己理解给大家一一介绍,有兴趣的可以关注一下,可以让你学到一些基础但是又非常实用的东西,基本上都是自己的一些理解和实践结果,对于新手来说可以避免走弯路(后期会出Java的其他重要 ...

  5. 阶段1 语言基础+高级_1-2 -面向对象和封装_11使用对象类型作为方法的返回值

    自定义的类做为方法的返回值.新建类Dmeo05 谁调用我,我就把one的地址返回给谁 内存中发生了什么 程序要想运行main方法先进栈 进来以后定义了一个phone two.two和刚才有什么不一样? ...

  6. OpenGL基础1:最简单的OpenGL例子

    相对于一些基础的课程,例如一门计算机语言,又或者说是Unity3D之类的游戏引擎,openGL的学习是要难不少,因此在网上"查攻略"的时候尽量想办法 1. 多参考几篇文章:2. 有 ...

  7. Java基础篇:面向对象

    文章目录 学习面向对象内容的三条主线 面向过程(POP)与面向对象(OOP) 面向对象的思想概述 Java类和对象 创建Java自定义类 对象的创建和使用 对象的创建和使用:匿名对象 类的成员之一:属 ...

  8. Java 基础篇之面向对象

    一. 什么是面向对象 1.1 类 类指对共享相同的属性.操作方法.行为及关系的一组对象的描述,是创建对象的模板. 示例: public class Dog {//属性private String na ...

  9. JavaSE(基础篇)——面向对象(万字总结)

    每日一语:努力不是重点,常态化才是关键.真正努力的人,能随时进入任何角色,在过程中找到感觉和快乐. 前言: 引用的狂神Java基础视频--狂神Java基础视频 目录 什么是面向对象 创建与初始化对象 ...

最新文章

  1. TVM部署和集成Deploy and Integration
  2. Mybatis 中$与#的区别
  3. File `listings.sty' not found. usepackage
  4. WCF 绑定(Binding)
  5. iOS10 CallKit简单开发
  6. Hadoop安装之JDK在Centos虚拟机中安装
  7. I00037 亏数(Deficient number)
  8. 用sqlserver手动写个split(字符分割)
  9. 窄带物联网(NB-IoT)技术开发云平台的系统构架图是什么?
  10. IP地址子网掩码位数换算方法及解释子网掩码的作用
  11. openSUSE安装WPS
  12. kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击
  13. 复利思维,静待时间的玫瑰慢慢绽放
  14. Ubuntu20安装RTL8811/RTL8812无线网卡驱动
  15. 微信公众平台的发展历史
  16. 伊利洛伊大学厄巴纳-香槟分校计算机专业,伊利诺伊大学厄巴纳香槟分校哪些专业比较好?...
  17. linux shell 命令记录
  18. 字符串数组(String []) 去掉重复值的方法
  19. unity上传头像_unity3d 上传本地PC图片
  20. 2021年危险化学品生产单位安全生产管理人员考试题及危险化学品生产单位安全生产管理人员最新解析

热门文章

  1. 简单使用linux感受,linux小白说说用linux的感受
  2. matlab 矩阵jocobi迭代_计算方法实验指导书1 -
  3. Linux删除文件夹的方法
  4. You have not concluded your merge (MERGE_HEAD exists)
  5. PLSQL中文显示乱码
  6. 单片机单口不可用或被占用_新唐单片机代码评审总结
  7. 2021牛客暑期多校训练营9,签到题HE
  8. linux deploy下载地址,Linux部署 Linux Deploy
  9. 4 相机切换_价格屠夫、训练伴侣——海鸟4K运动相机简评
  10. 计算机恢复语言文件格式,当你的电脑无故变成英文且语言包丢失后用这几招恢复-win7语言包...