本项目是一个功能简单的CAD,需要支持以下功能:
(详细的列表放在文件尾部,当完工的时候就请在前面加一个标记(或者加粗什么的))
- 绘制像素和几何图案
- 对几何图案进行修改
- 擦除素和几何图案
- 保存绘制结果(为自定义格式或者传统图像格式)
- 撤销(Undo)或者恢复(Redo)操作
其中,几何图形是指简单多边形或者椭圆形,暂时不支持其他图形。
- 像素绘制可以参考简单的画图工具(如MSPaint)。
- 几何图形绘制方式有待商榷。
- 被填充的几何图形视为边与内容的整体。未被填充的几何图形只考虑边。
- 图片有深度(但是摄像机是正交的不考虑透视只考虑遮挡)。没有图层的概念。
在简要分析了我们的任务之后,基本划定类结构如下。
还没有确定类的接口。可以再作讨论。
像素的画布。
弄成一个二维数组,不要过度封装。
几何图形虚基类。所有的几何图形派生自它。
多边形类。派生自IFigure。
椭圆类。派生自IFigure。
操作虚基类。所有的操作派生自它。这个类存在的意义是为了实现撤销堆栈。
笔画类。当使用像素绘画功能将会产生一个笔画对象。
存储这一比所画下的所有像素的位置。
派生自IOperation。
创建一个Figure的时候会产生一个此类对象加入堆栈。 派生自IOperation。
修改。这里指的是操作几何图形。
操作椭圆和操作多边形应该并不太一样。似乎第一次开会的时候并没有讨论清楚。可以再作讨论。
补充:
我思考了一下认为操作只有两种:
- 对整个图形的(移动/缩放,旋转)
- 对单个锚点的(多边形的拖动一个顶点,或者椭圆的单独修改长或者宽)
不过基本上是一样的,所以不要再派生类了,继承树决不能太深
整个图像视作一个Image。
一个完整的Image应该包含这几个部分:
- 一张Canvas
- 一个IFigure的列表(大概应该是Vector)
渲染器,把画好的东西显示出来。相当于就是OpenGL接口。
这个类等处理用户界面的同学写好之后才能尝试编写。
读写器。用来保存文件或者加载文件。
它会逐个调用每一个对象的save方法。
每一个Editor对应对一个Image的编辑。
一个完整的Editor应该包含这几个部分:
- 一个Image实例
- 一个IOperation的堆栈
- 一个Renderer对应一个编辑窗口
以加粗表示已经完成项,以星号*表示还未确定具体计划,需要讨论的项。
在讨论完成之后,就将*号标注的内容展开为各个子任务,例如实现类展开为各个类的类名。
- 初始化Repo和ReadMe
- 配置图形处理库环境(推荐OpenGL + OpenCV)
- 在Windows下建工程
- 设计类结构
- *实现类
- *完成测试