图形数据编辑应用JGraphics

来源:互联网 发布:linux查看mysql数据库 编辑:程序博客网 时间:2024/06/08 19:54

  • 前言
  • 技术概要
    • 技术方案
    • 关键设计
      • 全局变量
      • 绘制策略
      • 存储策略

前言

JGraphics是我为图形学这门课做的大作业,一款图形数据编辑软件。功能包括图形数据的输入、编辑、裁剪、变换、显示 、存储功能。用win32+OpenGL做的。
github-JGraphics
代码放这儿了。这篇博客不打算讲太多细节,主要算是随笔吧。并且一开始技术方案选得不好,Win32做实在是过时了,封装程度很低,用MFC会更合适一些,所以没有太多参考价值。


写这个玩意儿的过程中倒是有一些比较特殊的感受。软件不大,写了4天。不过因为是接近期末才开始写的,因此这4天的编码强度很高。并且从头到尾都是目标驱动。不像平时写点东西,看到什么感兴趣的都可以去研究一番。这种时间不太够的情况下,基本上就是能怎么快怎么写了。涉及到的很多原理都不求甚解。
再提一句,良好的设计是很重要的。这个项目没有什么时间进行前期准备,只是心里有个大概的感觉就开始写了。而且开始的时候我对Win32和OpenGL都不了解,写得更是磕磕绊绊。后面虽然没有打破原有的框架,但是还是经历了几次大的改动。
写完的时候可以感觉到,没有好好进行前期准备,大概也就只能驾驭这个规模的东西了,再大一些恐怕就要一定程度上重构了。

技术概要

技术方案

本项目没有直接采用更为方便的glut,原因是glut框架不方便提供人性化的用户界面。我使用了win32应用程序框架,以标准windows应用程序界面展现给用户,并由Windows API管理所有的交互事件。
同时,将主面板与OpenGL绑定,让OpenGL在主面板进行绘制。

关键设计

全局变量

  • vector<PicElem*> vec
    • PicElem是所有形状的父类,同时也是裁剪、填充操作的父类。
    • vec中按顺序存储了每次绘制的图形
  • Mode mode
    • 用户在绘制不同图形时,处在不同的模式下,变量mode与之关联
  • Color** pixels
    • 一个动态二维数组,保存了每个像素点的颜色

绘制策略

多数情况下,直接将pixels存储的点阵绘制到屏幕。这样做可以保证复杂度比较低(绘制窗口的长*宽),且复杂度与绘制图形的数量无关。否则,如果仅存储图形,使用OpenGL直接绘制线段、多边形等,随着绘制的图形增加,复杂度会变得很高,将会产生明显延迟。
特殊情况说明:
用户在绘制线段时,拖动选择端点,此线段是一直移动的(类似’画图’中的线段绘制)。此时刷新频率很高,如果将这些点同步到pixels再绘制点阵,每次刷新时先擦除再更新再绘制,会造成明显延迟。因此,这些时候调用OpenGL的绘制线段的功能进行绘制。当鼠标停下时再同步到pixels数组中。

存储策略

每种形状的类都重写output()函数,返回一个float output[]数组。output数组的第一个成员是数组长度,第二个成员是形状类型,后面是这个形状的相关数据。
每种形状的类都重写input()函数,可以解析自己生成的output[]数组。
存储时,首先写入一个Int类型的magic number来确定文件类型,然后按vec中的图形顺序,依次调用vec[i]->output(),存储得到的数组。
读取时,首先读取magic number,如果不是设定的magic number,报告错误。如果是,则进行解析。

0 0
原创粉丝点击