SongYC committed Feb 16, 2020 1 2 ``````# 南京大学《计算机图形学》课程大作业 `````` Yunjie Wu committed Oct 15, 2020 3 4 ``````## 更新记录 - \[2020/10/15 21:13\] 更新测试文本文件及参考结果图片 `````` Youcheng Song committed Apr 06, 2020 5 `````` `````` Yunjie Wu committed Oct 20, 2020 6 7 8 9 10 11 12 13 14 ``````## Q&A 1. 关于绘制时的纵坐标转换是什么意思？ 需要实现的绘制坐标系的坐标原点在屏幕左上方（往右为x正方向，往下为y正方向），而常规的二维坐标系是左下方为坐标原点（往右为x正方向，往上为y正方向）。 2. 操作指令如果出现旋转椭圆怎么办？ 测试数据不会出现规定之外的非法操作 `````` SongYC committed Feb 16, 2020 15 ``````## 1. 作业内容 `````` Yunjie Wu committed Sep 08, 2020 16 ``````本课程作业是横跨一学期的项目，要求跟随课程进度在项目中实现各种图形学算法，最终完成一个完整的图形学系统，进度自由安排，**`9月30日`**、**`10月31日`**、**`11月30日`**提交**进度报告**和**已完成代码**，**`12月26日`**提交**系统报告**、**完整的系统**、**系统使用说明书**和**系统演示视频**。 `````` SongYC committed Feb 16, 2020 17 `````` `````` SongYC committed Feb 16, 2020 18 ``````- 截止时间： `````` SongYC committed Feb 17, 2020 19 20 21 `````` > 提交日的 **`23:00`** `````` SongYC committed Feb 16, 2020 22 ``````- 提交方式： `````` Youcheng Song committed May 25, 2020 23 `````` `````` Youcheng Song committed Jun 14, 2020 24 `````` > **`提交前请仔细检查压缩包中是否已包含所有必要内容（系统代码、系统报告、使用说明书、演示视频），务必按要求组织文件结构和命名文件。`** `````` Youcheng Song committed May 25, 2020 25 `````` > `````` Yunjie Wu committed Oct 26, 2020 26 `````` > 十月报告提交地址：https://box.nju.edu.cn/u/d/b3583d14a12e44238e94/ `````` Youcheng Song committed May 29, 2020 27 `````` > `````` Yunjie Wu committed Oct 26, 2020 28 `````` > 查看已提交的文件：https://box.nju.edu.cn/d/e8d81f938d2d4f3885ed/ `````` Youcheng Song committed Mar 13, 2020 29 `````` > `````` Yunjie Wu committed Sep 08, 2020 30 `````` > 密码：cg2020 `````` SongYC committed Feb 17, 2020 31 `````` `````` SongYC committed Feb 16, 2020 32 ``````- 提交内容： `````` SongYC committed Feb 17, 2020 33 34 35 `````` > 一个`7z`压缩包 `````` SongYC committed Feb 16, 2020 36 ``````- 命名方式： `````` Yunjie Wu committed Sep 13, 2020 37 `````` >“学号\_月份.7z”，例如“17186001\_9.7z”。当提交错误，或有内容更新时，加上“\_v2”、“\_v3”等后缀重新提交，例如“17186001\_9\_v2.7z”。以截止时间前最晚的提交为准 `````` SongYC committed Feb 16, 2020 38 `````` > `````` Yunjie Wu committed Sep 08, 2020 39 `````` > **`！！！重要`**：请务必按要求命名，以免评分和查重时出现意外 `````` SongYC committed Feb 16, 2020 40 `````` `````` SongYC committed Feb 16, 2020 41 42 43 44 45 46 47 ``````- 文件结构： > ``` > 学号_月份 > |- 学号_报告.pdf > |- 学号_说明书.pdf > |- 学号_演示.mp4 > |- source `````` Youcheng Song committed Jun 14, 2020 48 `````` > | |- cg_algorithms.py `````` SongYC committed Feb 16, 2020 49 50 51 52 53 54 55 56 57 `````` > | |- cg_cli.py > | |- cg_gui.py > | |- ... > |- ... > ``` > 例如 > > ![](imgs/文件结构.png) > `````` Yunjie Wu committed Sep 13, 2020 58 `````` > **`！！！重要`**：请务必按要求组织文件结构，以免评分和查重时出现意外 `````` SongYC committed Feb 16, 2020 59 `````` `````` SongYC committed Feb 16, 2020 60 ``````## 2. 系统实现要求 `````` SongYC committed Feb 16, 2020 61 `````` `````` SongYC committed Feb 16, 2020 62 63 64 ``````使用[Python3](https://www.python.org)语言编程，实现一个绘图系统 ### 2.1. 要实现的内容 `````` SongYC committed Feb 16, 2020 65 66 ``````- 核心算法模块（各种图元的生成、编辑算法）：cg_algorithms.py > - 只允许依赖math库 `````` SongYC committed Feb 16, 2020 67 `````` > - 参考[CG_demo/cg_algorithms.py](CG_demo/cg_algorithms.py) `````` SongYC committed Feb 16, 2020 68 ``````- 命令行界面（CLI）程序：cg_cli.py `````` SongYC committed Feb 16, 2020 69 `````` > - 读取包含了图元绘制指令序列的文本文件，依据指令调用核心算法模块中的算法绘制图形以及保存图像 `````` SongYC committed Feb 16, 2020 70 `````` > - 允许依赖第三方库[numpy](https://pypi.org/project/numpy/)和[Pillow](https://pypi.org/project/Pillow/)，用于将画布保存为图像 `````` SongYC committed Feb 16, 2020 71 72 `````` > - 程序接受两个外部参数：指令文件的路径和图像保存目录 > - 测试程序时的指令格式如下： `````` SongYC committed Feb 17, 2020 73 `````` > `````` SongYC committed Feb 16, 2020 74 75 76 `````` > >``` > >python cg_cli.py input_path output_dir > >``` `````` SongYC committed Feb 16, 2020 77 `````` > - 参考[CG_demo/cg_cli.py](CG_demo/cg_cli.py) `````` SongYC committed Feb 16, 2020 78 ``````- 用户交互界面（GUI）程序：cg_gui.py `````` SongYC committed Feb 16, 2020 79 `````` > - 以鼠标交互的方式，通过鼠标事件获取所需参数并调用核心算法模块中的算法将图元绘制到屏幕上，或对图元进行编辑 `````` SongYC committed Feb 17, 2020 80 `````` > - 要实现[2.2节](#22-指令文件格式)中的所有功能 `````` SongYC committed Feb 16, 2020 81 `````` > - 界面样式和交互方式不做限制，可自由设计 `````` SongYC committed Feb 16, 2020 82 `````` > - 可自由选择GUI库，如[PyQt5](https://pypi.org/project/PyQt5/)、Tkinter等 `````` SongYC committed Feb 16, 2020 83 `````` > - 测试程序时的指令格式如下： `````` SongYC committed Feb 17, 2020 84 `````` > `````` SongYC committed Feb 16, 2020 85 `````` > >``` `````` SongYC committed Feb 17, 2020 86 `````` > >python cg_gui.py `````` SongYC committed Feb 16, 2020 87 `````` > >``` `````` SongYC committed Feb 16, 2020 88 89 `````` > - 参考[CG_demo/cg_gui.py](CG_demo/cg_gui.py) `````` SongYC committed Feb 17, 2020 90 ``````[CG_demo](CG_demo)仅提供了一种简单的系统架构及交互逻辑，可以直接在此基础上丰富、优化功能；也可以另起炉灶，设计更优秀的系统架构和交互方式。 `````` SongYC committed Feb 16, 2020 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 `````` ### 2.2. 指令文件格式 每行一条指令，包括： - 重置画布 > ``` > 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, 控制点坐标 > `````` Youcheng Song committed Apr 06, 2020 163 `````` > algorithm: string, 绘制使用的算法，包括"Bezier"和"B-spline", 其中"B-spline"要求为三次（四阶）均匀B样条曲线，曲线不必经过首末控制点 `````` SongYC committed Feb 16, 2020 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 `````` - 图元平移 > ``` > 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" `````` Youcheng Song committed Feb 19, 2020 207 208 209 210 ``````说明： - 参考[CG_demo/input.txt](CG_demo/input.txt)，测试时保证所有指令都是合法的 - 图元不需要填充内部颜色 - 不需要对椭圆进行旋转 `````` Youcheng Song committed Apr 30, 2020 211 212 ``````- 绘制图像时需要转换坐标：图像坐标系的y轴方向是反的，所以坐标(x,y)的点应当绘制在图像中(x,height-1-y)坐标的像素上 - 平移、旋转以绘制出来的图像的视觉效果为准 `````` SongYC committed Feb 16, 2020 213 214 215 216 217 `````` ## 3. 进度报告/系统报告要求 - 在上个月报告的基础上添加本月新的内容即可，无需从头重写 - 报告内容包括： `````` SongYC committed Feb 17, 2020 218 219 220 `````` > - 已完成或拟采用算法的原理介绍、自己的理解、对比分析等 > - 已完成或拟采用的系统框架、交互逻辑、设计思路等 > - 介绍自己系统中的巧妙的设计、额外的功能、易用的交互、优雅的代码、好看的界面等（可选） `````` SongYC committed Feb 16, 2020 221 222 223 ``````- 请附上联系方式（邮箱或QQ等），以便出现问题时及时联系 - 需注明在实现作业过程中使用的参考资料，包括技术博客等 - 可添加附加材料(觉得需要附加说明的代码等) `````` SongYC committed Feb 17, 2020 224 ``````- 使用助教提供的Word或LaTeX文档模板撰写报告，Word需要另存为或打印为pdf文件后再提交 `````` SongYC committed Feb 16, 2020 225 `````` `````` SongYC committed Feb 16, 2020 226 227 228 229 ``````## 4. 系统使用说明书要求 - 说明开发环境，包括用到的第三方库及其版本 - 对系统每个功能进行介绍并截图展示运行结果，清楚说明系统操作方式 - 需要生成为pdf文件后提交 `````` Youcheng Song committed Feb 12, 2020 230 `````` `````` SongYC committed Feb 16, 2020 231 ``````## 5. 系统演示视频要求 `````` SongYC committed Feb 17, 2020 232 ``````- 展示你的GUI程序中实现的所有功能 `````` SongYC committed Feb 16, 2020 233 234 235 236 237 ``````- 直接录制的视频通常体积较大，请压制后再提交： > 可安装[ffmpeg](https://www.ffmpeg.org)后，用以下指令压制： > ``` > ffmpeg -i input.mov -b:v 4000k output.mp4 > ``` `````` SongYC committed Feb 16, 2020 238 239 240 241 242 243 244 245 246 247 248 `````` 也可自行探索更合适的压制参数，或者使用其他压制工具 - 前两次进度报告`不要`提交视频文件 ## 6. 测试环境说明 测试环境为[VirtualBox](https://www.virtualbox.org/wiki/Downloads)虚拟机： - [Ubuntu 18.04 x86_64](https://ubuntu.com) - [Python 3.7.4](https://www.python.org) - [numpy 1.18.1](https://pypi.org/project/numpy/) - [pillow 7.0.0](https://pypi.org/project/Pillow/) - [pyqt 5.9.2](https://pypi.org/project/PyQt5/) `````` SongYC committed Feb 17, 2020 249 250 ``````CLI程序原则上只允许依赖numpy和pillow两个第三方库；GUI程序如果有其他特殊需求，要在系统使用说明书中注明。 `````` SongYC committed Feb 16, 2020 251 ``````## 7. 开发环境配置 `````` SongYC committed Feb 17, 2020 252 253 254 255 256 257 258 259 ``````不必和测试环境完全一致，python和python库的小版本不同一般不会影响程序运行。 - 简单方法一： > 安装[Anaconda](https://www.anaconda.com/distribution/#download-section)，大而全，包含了numpy、Pillow、PyQt5和很多其他常用库 - 简单方法二： > 直接在测试环境虚拟机中开发，需要自行配置IDE/编辑器。 > `````` Yunjie Wu committed Sep 14, 2020 260 `````` > 虚拟机文件[下载地址](https://box.nju.edu.cn/d/19abd9b3c3c54b95ab3c/)，密码：cg2020 (虚拟机内环境登录账号：cg 密码：cg) `````` SongYC committed Feb 17, 2020 261 262 263 264 265 266 267 268 269 270 271 272 273 `````` IDE/编辑器选择： - [PyCharm](https://www.jetbrains.com/pycharm/download/)：功能强大 - [Spyder](https://www.spyder-ide.org)：Anaconda自带 - [VSCode](https://code.visualstudio.com)+[Python extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)：轻量级 - [...](https://wiki.python.org/moin/IntegratedDevelopmentEnvironments) ## 8. 评分标准 - 核心算法模块+CLI程序：40分 > 由评分脚本自动运行程序，给定输入文件，比较生成的图像与标准答案（有容错机制，不要求像素级一致） > > 对于没有得到满分的程序，我们会人工二次检查 - GUI程序+系统演示视频：30分 `````` SongYC committed Feb 17, 2020 274 `````` > 通过鼠标交互实现[2.2节](#22-指令文件格式)中的所有功能，即可得到满分 `````` SongYC committed Feb 17, 2020 275 `````` > `````` SongYC committed Feb 17, 2020 276 277 278 279 `````` > 实现额外的图形学功能、重新设计更好的程序架构和交互逻辑等，能够提升给报告评分时的宽容度 - 进度报告+系统报告+系统使用说明书：30分 > 按时提交进度报告能够提升评分时的宽容度 ``````