目录
1 语言、开发环境以及框架 1
2 数据结构 1
2.1 图元 2
2.2 GUI框架 3
2.3 CLI类 3
3 图元绘制、变换算法原理、实现及分析 4
3.1 线段的DDA算法 4
3.2 线段的Bresanham算法 6
3.3 中点椭圆算法 8
3.4 多边形的绘制方法 11
3.5 Bezier曲线的绘制 12
3.6 B样条曲线的绘制 15
3.7 图元的平移 17
3.8 图元的旋转 17
3.9 图元的缩放 18
3.10 线段的裁剪的Cohen-Sutherland算法 20
3.11 线段的裁剪的梁友栋-Barsky算法 24
4 框架设计 26
4.1 CLI设计 27
4.2 命令行文件的读取和执行 27
4.3 GUI设计 29
4.4 鼠标交互进行图元绘制及变换 30
5 其他功能 41
5.1 拖动画布边界以调整画布尺寸 41
5.2 显示曲线控制点并随时拖动控制点以调节曲线 41
References: 43
1 语言、开发环境以及框架
本程序使用python3.7编写,在windows运行;图形界面部分使用tkinter框架。
2 数据结构
本程序的主要涉及到三种数据结构,第一个是用于存放图元信息的Primitive类及其派生类Line,Circle,Polygon等,第二个是GUI类,用于实现GUI交互逻辑,以及画板和图元信息的存放。第三个是CLI类,它是精简的GUI类,删去了和GUI相关的部分,保留绘图部分。
2.1 图元
所有的图元都是对象,他们的基类是Primitive类,包括以下数据属性:
1.def init(self, vertex, pno, color):
2. self.vertex = vertex
3. self.pixels = []
4. self.pno = pno
5. self.color = color
self.vertex list类型,其中每个元素是一个二元组,表示该图元的顶点;
self.pixels list类型,元素类型同上,这个图元光栅化后的所有像素坐标都存在;
self.pno int类型,是图元的id
self.color 长度为3的list, 表示这个图元的RGB值。
还包括以下方法:
self.rasterization(self): 使用图元的顶点等信息,来求出该图元在画布中所有像素的位置,并将其存放在self.pixels数据属性中;
self.get_pixels(self):返回self.pixels;若为空,则先调用上一个函数进行光栅化然后再返回。
self.get_color(self): 将self.color整理成一个24位的数字返回,供绘图使用。
·直线类:Line继承自Primitive类, 还有以下数据属性:
1.def init(self, vertex, pno, method, color):
2. super().init(vertex, pno, color)
3. self.vertical = 0 # 是否存在斜率
4. self.slope = 0
5. self.method = method
self.vertical int类型,用来表示是否垂直;
self.slope int类型,是线段的斜率;若垂直,则将斜率定为10000;
self.method int类型,用来表示画图的算法(DDA或Bresenham)
还有以下方法:
self.DDA(self): DDA算法,用于在self.rasterization(self)中调用。
self.Bresenham(self): Bresenham算法,同上。
·椭圆类:Circle, 继承自Primitives类,还具有以下的数据属性:
1.def init(self, vertex, pno, color):
2. super().init(vertex, pno, color)
3. self.rx = vertex[1][0]
4. self.ry = vertex[1][1]
self.rx, self.ry int类型,长半轴的短半轴(ps. 椭圆的中心存放在self.vertex的第一个元素中)
·多边形类:Polygon,继承自Primitive类,还具有以下数据属性:
1.def init(self, vertex, pno, method, is_done, color): # is_done:命令行直接完成,图形界面要等待完成
2. super().init(vertex, pno, color)
3. self.method = method
4. self.is_done = is_done
5. self.lines = []
6. self.last_point = vertex[0]
7. self.is_updating = 0
8. self.new_point = [0, 0]
self.method int类型,用来表示画图的算法(DDA或Bresenham);
self.is_done int类型,用于区分命令行绘制还是鼠标绘制;
self.lines list类型,元素为Line。用来表示构成多边形的直线;
self.last_point, self.new_point, list类型,self.is_updating int类型,均用于鼠标绘制多边形过程中的操作。
还具有以下方法,均用于鼠标绘制多边形:
self.updating(self, point): 鼠标拖动过程,用于动态显示当前绘制的边;
self.update_rasterization(self, point):鼠标松开后,用于添加刚刚绘制好的顶点和边;
self.done(self):完成绘制后,连接第一个和最后一个点。
·曲线类:Curve,继承自Primitive类,还具有以下数据属性
self.alg 字符串,表示曲线绘制的算法,取值为‘Bezier’或‘B-spline’
各接口的详细功能和具体实现将在后续算法和框架部分详细描述
2.2 GUI框架
GUI框架是GUI类的一个对象,包括以下数据成员:
·窗口以及组件
self.top:主窗口
self.paper:tkinter的画布
以及各种按钮:self.draw_line, self.draw_circle, self.clean, self.close, self.save, self.line_DDA , self.line_Bre, self.owl, self.polygon, 等等,用来输入坐标以绘制图元或者改变鼠标绘制图元的类型。
·图元相关信息
self.primitives 由Primitive类的对象构成的list,存放着画布中所有图元的信息
·画布相关信息
self.image 图片文件,显示在tkinter的画布上
self.color_r, self.color_g, self.color_b 画笔颜色
self.size_x, self.size_y 画布大小
self.save_name 要保存的文件名
self.draw 画笔
等等。
以及各种运行时需要的函数。各函数的功能以及实现的过程将在框架设计部分详细描述。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!