# 基于python实现完整图形学功能系统
**摘要**: 本次大作业已经完成。实现了一个完整的图形学系统,功能包括初始化/重置画布,保存画布,设置画笔颜色,绘制线段,绘制多边形,绘制椭圆,绘制曲线,对图元的平移、旋转、缩放和对线段的裁剪。系统实现了上述功能的算法、在 CLI 下使用文件输入调用上述功能的接口以及在 GUI 下使用鼠标事件进行绘图以及图元编辑的功能。
**关键词**: 图形学系统;图元算法;文件输入;鼠标交互;GUI
# 一、语言、开发环境以及框架
本程序使用 python3.7 编写,在 windows 运行;图形界面部分使用 tkinter 框架。
# 二、数据结构
本程序的主要涉及到三种数据结构,第一个是用于存放图元信息的 Primitive 类及其派生类 Line,Circle,Polygon 等,第二个是 GUI 类,用于实现 GUI 交互逻辑,以及画板和图元信息的存放。第三个是 CLI 类,它是精简的 GUI 类,删去了和 GUI 相关的部分,保留绘图部分。
## 2.1 图元
所有的图元都是对象,他们的基类是 Primitive 类,包括以下数据属性:
```python
definit(self,vertex,pno,color):
self.vertex=vertex
self.pixels=[]
self.pno=pno
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 类, 还有以下数据属性:
```python
definit(self,vertex,pno,method,color):
super().init(vertex,pno,color)
self.vertical=0#是否存在斜率
self.slope=0
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 类,还具有以下的数据属性:
```python
definit(self,vertex,pno,color):
super().init(vertex,pno,color)
self.rx=vertex[1] [0]
self.ry=vertex[1] [1]
```
- self.rx, self.ry int 类型,长半轴的短半轴(ps. 椭圆的中心存放在 self.vertex 的第一个元素中)
·多边形类:Polygon,继承自 Primitive 类,还具有以下数据属性:
```python
def __init__(self, vertex, pno, method, is_done, color): # is_done:命令行直接完成,图形界面要等待完成
super().__init__(vertex, pno, color)
self.method = method
self.is_done = is_done
self.lines = []
self.last_point = vertex[0]
self.is_updating = 0
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 画笔
等等。
以及各种运行时需要的函数。各函数的功能以及实现的过程将在框架设计部分详细描述。
## 2.3 CLI 类
CLI 类是进行文件输入和绘制的对象,包括以下数据成员:
- self.image 图片文件,显示在 tkinter 的画布上
- self.color_r, self.color_g, self.color_b 画笔颜色
- self.size_x, self.size_y 画布大小
- self.primitives 由 Primitive 类的对象构成的 list,存放着画布中所有图元的信息
- self.save_name 要保存的文件名
- self.draw 画笔
以及用来实现解析指令、绘制图元等功能的函数
# 三、图元绘制、变换算法原理
此部分基于 Primitive 类,图元的绘制使用图元的基本信息,如线段的顶点,椭圆的圆心的长短半轴,多边形的顶点等等,来获得图元的需要在画布上占据的所有像素点的坐标,并将其返回给框架。而图元的变换(待添加)在原图元的基础上,对图元进行修改并返回新的像素点坐标。
涉及算法有:
> 详细请参看Word文档
- 线段的 DDA 算法
DDA 算法方法是利用计算两个坐标方向的差 分来确定线段显示的屏幕像素位置的线段扫描转换算法。也就是说,通过在一个坐标轴 上以单位间隔对线段取样(取 △x=1 或 △y=1),计算 △y 或 △x 决定另一个坐标轴上靠近 线段路径的对应整数值。
- 线段的 Bresanham 算法
Bresenham 画线算法是一种精确而有效的光栅线段生成算法,它可用于圆和其它曲线显示的整数增量运算。
- 中点椭圆算法
椭圆被定义为到两个定点(焦点)的距离之和等于常数的点的集合。在任意方向指定一个椭圆的交互方法是输入两个焦点和一个椭圆边界上的点,利用这三个坐标位置,就可求出显式方程中的常数,而后就可求出隐式方程中的系数,并用来生成沿椭圆路径的像素。
- 多边形的绘制方法
多边形的绘制可以转变为多个直线的绘制,因此不涉及到新的算法。但是,由于鼠标绘制多边形的需要,多边形的某条直线可能并不属于这个多边形,这就需要多边形来提供更多的接口,来实现鼠标拖动时的预览。
- Bezier 曲线的绘制
Bézier 曲线是通过一组多边折线的各顶点唯一定义出来的。曲线的形状趋向于多边折线的形状,改变多边折线的顶点坐标位置和改变曲线的形状有紧密的联系。因此,多边折线有常称为特征多边形,其顶点称为控制顶点。一般,Bezier 曲线段可拟合任何数目的控制顶点。Bezier 曲线段逼近这些控制顶点,且它们的相关位置决定了 Bezier 多项式的次数。类似插值样条,Bezier 曲线可以由给定边界条件、特征矩阵或混合函数决定,对一般 Bezier 曲线,方便的是混合函数形式
- B 样条曲线的绘制
B 样�
shejizuopin
- 粉丝: 1w+
- 资源: 1302
最新资源
- 实验室管理微信小程序+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 实习记录小程序+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 校园水电费管理微信小程序的设计与实现+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 校园快递平台系统(小程序)--论文pf-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 私家车位共享系统+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 校园二手交易微信小程序的设计与实现--论文pf-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 停车场管理+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 随堂测微信小程序+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 新冠疫苗预约小程序--论文-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 同城家政服务+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 外籍人员管理系统小程序+ssm-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 新冠抗原自测平台小程序--论文pf-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 网络安全科普系统开发与设计+springboot-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 学生购电小程序-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 供应链管理中基于运筹学优化算法的自动化排产系统解决方案
- 学生毕业管理系统_y65fk--论文-微信小程序毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈