# 基于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 样�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:lunwen文档word+项目源码+项目截图 本程序使用python3.7编写,在windows运行;图形界面部分使用tkinter框架。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/126760380
资源推荐
资源详情
资源评论
收起资源包目录
基于pythonGUI的图形绘图及图元编辑系统.zip (65个子文件)
截图
line.gif 49KB
reset.gif 109KB
curve2.gif 105KB
EY73$03BG`LHPD(`S6FG5V1.png 170KB
scale.gif 100KB
FKZ()IU[F}CZ{MVY}[][OLL.png 151KB
clip.gif 161KB
circle.gif 60KB
color.gif 0B
2.huitu.jpg 28KB
rotate.gif 140KB
U84UJO0UKI[2X_UV2S7X97V.png 139KB
color-1577531535442.gif 983KB
translate.gif 102KB
1.whole.png 36KB
3A4M)12EU4[9IW212(5V@UE.png 32KB
RHH(32Q0IQC_AB}QNHTN({Q.png 118KB
TE7@PFEHY9~[IE@(8K8DQGK.png 44KB
curve1.gif 61KB
polygon.gif 83KB
YA_4W(O{RKH9H13TE7JES[N.png 99KB
基于pythonGUI的图形绘图及图元编辑系统 项目源码
polygon.py 2KB
main.py 34KB
curve.py 5KB
main_cli.py 8KB
picture
line.gif 49KB
reset.gif 109KB
curve2.gif 105KB
scale.gif 100KB
clip.gif 161KB
circle.gif 60KB
color.gif 0B
2.huitu.jpg 28KB
rotate.gif 140KB
color-1577531535442.gif 983KB
translate.gif 102KB
1.whole.png 36KB
curve1.gif 61KB
polygon.gif 83KB
__pycache__
curve.cpython-37.pyc 4KB
polygon.cpython-37.pyc 2KB
circle.cpython-37.pyc 3KB
main.cpython-37.pyc 12KB
base.cpython-37.pyc 4KB
imgs.cpython-37.pyc 11KB
line.cpython-37.pyc 6KB
circle.py 5KB
imgs.py 11KB
line.py 11KB
venv
pyvenv.cfg 85B
.idea
other.xml 233B
misc.xml 288B
vcs.xml 180B
modules.xml 280B
dictionaries
14266.xml 343B
Graphic_system.iml 554B
workspace.xml 31KB
inspectionProfiles
Project_Default.xml 1KB
drawLine.png 2KB
unuesd.py 3KB
main.spec 873B
README.md 35KB
input.txt 197B
base.py 4KB
基于pythonGUI的图形绘图及图元编辑系统 毕业论文.docx 533KB
共 65 条
- 1
资源评论
- WilsonFu19782023-12-25资源很赞,希望多一些这类资源。
shejizuopin
- 粉丝: 9510
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功