本课程作业是横跨一学期的项目,要求跟随课程进度在项目中实现各种图形学算法,最终完成一个完整的图形学系统,进度自由安排,3月31日
、4月30日
提交进度报告和已完成代码,5月31日
提交系统报告、完整的系统、系统使用说明书和系统演示视频。
-
截止时间:
提交日的
23:00
-
提交方式:
稍后公布
-
提交内容:
一个
7z
压缩包 -
命名方式:
“学号_月份.7z”,例如“17186001_3.7z”。当提交错误,或有内容更新时,加上“_v2”、“_v3”等后缀重新提交,例如“17186001_3_v2.7z”。以截止时间前最晚的提交为准
!!!重要
:请务必按要求命名,以免自动化评分和查重时出现意外 -
文件结构:
学号_月份 |- 学号_报告.pdf |- 学号_说明书.pdf |- 学号_演示.mp4 |- source | |- cg_alforithms.py | |- cg_cli.py | |- cg_gui.py | |- ... |- ...
例如
!!!重要
:请务必按要求组织文件结构,以免自动化评分和查重时出现意外
使用Python3语言编程,实现一个绘图系统
- 核心算法模块(各种图元的生成、编辑算法):cg_algorithms.py
- 只允许依赖math库
- 参考CG_demo/cg_algorithms.py
- 命令行界面(CLI)程序:cg_cli.py
-
读取包含了图元绘制指令序列的文本文件,依据指令调用核心算法模块中的算法绘制图形以及保存图像
-
程序接受两个外部参数:指令文件的路径和图像保存目录
-
测试程序时的指令格式如下:
python cg_cli.py input_path output_dir
-
- 用户交互界面(GUI)程序:cg_gui.py
CG_demo仅提供了一种简单的系统架构及交互逻辑,可以直接在此基础上丰富、优化功能;也可以另起炉灶,设计更优秀的系统架构和交互方式。
每行一条指令,包括:
-
重置画布
resetCanvas width height
清空当前画布,并重新设置宽高
width, height: int
100 <= width, height <= 1000
-
保存画布
saveCanvas name
将当前画布保存为位图name.bmp
name: string
-
设置画笔颜色
setColor R G B
R, G, B: int
0 <= R, G, B <= 255
-
绘制线段
drawLine id x0 y0 x1 y1 algorithm
id: string, 图元编号,每个图元的编号是唯一的
x0, y0, x1, y1: int, 起点、终点坐标
algorithm: string, 绘制使用的算法,包括"DDA"和"Bresenham"
-
绘制多边形
drawPolygon id x0 y0 x1 y1 x2 y2 ... algorithm
id: string, 图元编号,每个图元的编号是唯一的
x0, y0, x1, y1, x2, y2 ... : int, 顶点坐标
algorithm: string, 绘制使用的算法,包括"DDA"和"Bresenham"
-
绘制椭圆(中点圆生成算法)
drawEllipse id x0 y0 x1 x1
id: string, 图元编号,每个图元的编号是唯一的
x0, y0, x1, y1: int, 椭圆矩形包围框的左上角和右下角顶点坐标
-
绘制曲线
drawCurve id x0 y0 x1 y1 x2 y2 ... algorithm
id: string, 图元编号,每个图元的编号是唯一的
x0, y0, x1, y1, x2, y2 ... : int, 控制点坐标
algorithm: string, 绘制使用的算法,包括"Bezier"和"B-spline"(三次均匀B样条曲线,曲线不必经过首末控制点)
-
图元平移
translate id dx dy
id: string, 要平移的图元编号
dx, dy: int, 平移向量
-
图元旋转
rotate id x y r
id: string, 要旋转的图元编号
x, y: int, 旋转中心
r: int, 顺时针旋转角度(°)
-
图元缩放
scale id x y s
id: string, 要缩放的图元编号
x, y: int, 缩放中心
s: float, 缩放倍数
-
对线段裁剪
clip id x0 y0 x1 y1 algorithm
id: string, 要裁剪的线段编号
x0, y0, x1, y1: int, 裁剪窗口的左上角和右下角顶点坐标
algorithm: string, 裁剪使用的算法,包括"Cohen-Sutherland"和"Liang-Barsky"
参考CG_demo/input.txt。测试时,保证所有指令都是合法的。
-
在上个月报告的基础上添加本月新的内容即可,无需从头重写
-
报告内容包括:
- 已完成或拟采用算法的原理介绍、自己的理解、对比分析等
- 已完成或拟采用的系统框架、交互逻辑、设计思路等
- 介绍自己系统中的巧妙的设计、额外的功能、易用的交互、优雅的代码、好看的界面等(可选)
-
请附上联系方式(邮箱或QQ等),以便出现问题时及时联系
-
需注明在实现作业过程中使用的参考资料,包括技术博客等
-
可添加附加材料(觉得需要附加说明的代码等)
-
使用助教提供的Word或LaTeX文档模板撰写报告,Word需要另存为或打印为pdf文件后再提交
- 说明开发环境,包括用到的第三方库及其版本
- 对系统每个功能进行介绍并截图展示运行结果,清楚说明系统操作方式
- 需要生成为pdf文件后提交
- 展示你的GUI程序中实现的所有功能
- 直接录制的视频通常体积较大,请压制后再提交:
可安装ffmpeg后,用以下指令压制:
ffmpeg -i input.mov -b:v 4000k output.mp4
- 前两次进度报告
不要
提交视频文件
测试环境为VirtualBox虚拟机:
CLI程序原则上只允许依赖numpy和pillow两个第三方库;GUI程序如果有其他特殊需求,要在系统使用说明书中注明。
不必和测试环境完全一致,python和python库的小版本不同一般不会影响程序运行。
-
简单方法一:
安装Anaconda,大而全,包含了numpy、Pillow、PyQt5和很多其他常用库
-
简单方法二:
直接在测试环境虚拟机中开发,需要自行配置IDE/编辑器。
虚拟机文件下载地址:稍后发布
IDE/编辑器选择:
- PyCharm:功能强大
- Spyder:Anaconda自带
- VSCode+Python extension:轻量级
- ...
- 核心算法模块+CLI程序:40分
由评分脚本自动运行程序,给定输入文件,比较生成的图像与标准答案(有容错机制,不要求像素级一致)
对于没有得到满分的程序,我们会人工二次检查
- GUI程序+系统演示视频:30分
通过鼠标交互实现2.2节中的所有功能,即可得到满分
实现额外的图形学功能、重新设计更好的程序架构和交互逻辑等,能够提升给系统报告评分时的宽容度
- 进度报告:不记分
按时提交进度报告能够提升给系统报告评分时的宽容度
- 系统报告+系统使用说明书:30分