# 计算机图形学 **Repository Path**: Vanisper/CG ## Basic Information - **Project Name**: 计算机图形学 - **Description**: 计算机图形学 - **Primary Language**: C++ - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-10-16 - **Last Updated**: 2022-02-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 计算机图形学 计算机图形学基础教程(Vc++)第二版 孔令德 [下载VC++6.0](./vc6_cn_full.zip) ## 封面 ![book.jpg](./book.jpg) - 本仓库地址: [https://gitee.com/zwdcdu/CG](https://gitee.com/zwdcdu/CG) ## 学生实验发送 实验结果通过每个班的学委发送到老师的邮箱(zwdbox@cdu.edu.cn),一个班一个压缩文件。不要单独以学生个人名称发送。文件名如下:数媒19-03.zip - 数媒19-01.zip - 数媒19-02.zip - 数媒19-03.zip 文件内容样例: - 数媒19-**.zip - 201710421118张三.zip - test1/ - 实验报告.docx - 源代码 - test2/ - test3/ - test4/ - test5/ - test6/ - 201710421119李四.zip - test1/ - test2/ - test3/ - test4/ - test5/ - test6/ ## 实验1 - 实验名称:反走样直线段绘制的程序设计 - 实验软件:VC++6.0 - 实验目的:使用Wu反走样算法绘制金钢石图形,在一个界面上同时绘制两个金钢石图形,一个用正常直线,另一个用反走样直线,等分点个数至少20个。Wu反走样原理是各个方向的反走样直线:像素点离理想直线段越近,其亮度值越小,像素越暗;像素点离理想直线段越远,其亮度值就越大,像素越亮。 - 实验分析:对比两个图形的效果,分析优点和缺点,并说明原因。 - 实验结果参见:![走样对比图](img/test1.png) - 老师的样例程序参见:[test1](./test1.exe) ## 实验2 - 实验名称:多边形填充的程序设计 - 实验软件:VC++6.0 - 实验目的:使用鼠标+键盘绘制一个带孔的多边形,然后进行填充。 - 实验分析:如何表达一个多边形?如何用鼠标键盘绘制一个带孔的多边形,多边形如何填充。 - 样例程序参见:fillpoly,GlyphTest(汉字轮廓) - 老师的样例程序参见:[test2](./test2.exe) - MFC添加消息处理: ```text 鼠标指向view类,选择右键弹出菜单:Add Windows Message Handler WM_LBUTTONDOWN WM_RBUTTONDOWN WM_CHAR Invalidate(true);//重绘窗口 ``` ## 实验3 - 实验名称:多边形二维变换程序设计 - 实验软件:VC++6.0 - 实验目的:参见案例11,将案例11中的四边形改成其他形体。使用包围四边形对多边形进行缩放和旋转,参见Word中的相关功能。 - 实验分析:如何生成和绘制包围多边形,如何进行鼠标控制。补充练习:如何让鼠标命中多边形,然后拖动它?PtInRegion,CreatePolygonRgn - 样例程序参见:案例11-二维图形几何变换算法 - 算法参见:[test3.md](test3.md) ## 实验4 - 实验名称:三维形体的表示 - 实验软件:VC++6.0 - 实验目的:参见9.4正八面体,9.5凸多面体,9.6立方体画家算法,参见教材Page264-266,构造并显示一个正十二面体的三维形体,显示线框图和填充图。 - 实验分析:如何通过算法生成点表,边表,和面表,如何使用法失量消隐不可见的面。 - 样例程序参见:参见9.4正八面体,9.5凸多面体,9.6立方体画家算法 ## 实验5 - 实验名称:三维形体的真实感表示 - 实验软件:VC++6.0 - 实验目的:参见10.6圆环光照,Gouraud明暗处理模型,Z-Buffer算法,构造并显示一个正十二面体的三维形体的真实感图像。 - 实验分析:如何通过算法生成点表,边表,和面表,如何使用法失量消隐不可见的面,如何使用Gouraud颜色模型。 - 样例程序参见:参见参见10.6圆环光照,参见test4 - [Gouraud明暗处理模型](https://www.51wendang.com/doc/b732cedd42a341378c60e769/12) ## 第六章思考题目 - 使用深度坐标,给“案例19-透视投影算法”增加消隐功能。 ## C语言程序设计注意点 - 多文件(*.h,*.cpp) - C语言自有文件,自定义文件class - 多读源代码,再编写自己的代码。 - 调试程序debug: - 设置断点,F5运行程序,程序在断点停下来,单步执行F10,通过鼠标悬停查看变量的值。分析值是否正确。 - 在最可能出现错误的地方设置 ## 考试重点 - 直线绘制,反走样算法 - 坐标变换,齐次坐标,矩阵操作 - Bezier曲线/曲面绘制 - 真实感图形显示,消隐算法 - 多边形填充算法 ## 其他 - [VC控件与变量绑定小结](https://www.cnblogs.com/baogg/articles/1979299.html) - [C++代码实现光线追踪-算法](http://www.kevinbeason.com/smallpt/) ## OnDraw()样例 ```c void CTest2View::OnDraw(CDC* pDC){ CTest2Doc* pDoc = GetDocument();ASSERT_VALID(pDoc); CRect rect; GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(),rect.Height()); pDC->SetViewportExt(rect.Width(),-rect.Height()); pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //横向坐标轴 pDC->MoveTo(0,0);pDC->LineTo(100,0); //横向箭头: pDC->MoveTo(100,0);pDC->LineTo(95,5); pDC->MoveTo(100,0);pDC->LineTo(95,-5); //纵向坐标轴 pDC->MoveTo(0,0);pDC->LineTo(0,100); //纵向箭头: pDC->MoveTo(0,100);pDC->LineTo(-5,95); pDC->MoveTo(0,100);pDC->LineTo(5,95); //写坐标原点文字 pDC->TextOut(0,-3,"(0,0)"); //绘制自定义直线 pDC->MoveTo(0,0); pDC->LineTo(200,100); } ``` ## 反走样对比代码 ```c void CTest9View::OnDraw(CDC* pDC) { CTest9Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //坐标映射,原点到屏幕中心 CRect rect; GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(),rect.Height()); pDC->SetViewportExt(rect.Width(),-rect.Height()); pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //有锯齿 pDC->MoveTo(-100,-50+5);pDC->LineTo(200,50+5); //没有锯齿 CPoint p0(-100,-50),p1(200,50),p; int dx,dy; dx=p1.x-p0.x; dy=p1.y-p0.y; double k=(double)dy/dx,e; for(p=p0,e=0;p.xSetPixelV(p.x, p.y,RGB(e*255,e*255,e*255)); pDC->SetPixelV(p.x, p.y+1,RGB((1-e)*255,(1-e)*255,(1-e)*255)); e+=k; if(e>=1.0) { p.y++; e--; } } // TODO: add draw code for native data here } ```