计算机图形学实验

文章目录

  • 实验介绍
    • 实验背景
    • 编程环境
  • 实验内容
    • 实验一 —— 扫描转换算法
    • 实验二 —— 裁剪算法
    • 实验三 —— 图形变换
    • 实验四 —— 三维图形投影和消隐
    • 实验五 —— 曲线和曲面
  • 实验源码

实验介绍

实验背景

大二学期的计算机图形学课程,内容包含扫描转换算法裁剪算法图形变换三维图形投影和消隐曲线和曲面;从完成情况来看虽算不上十分出色,但也花了很多时间和精力,代码必然存在一些冗余、不足和待改进之处,故公开和大家交流和参考

编程环境

  • VC++ 6.0
  • easyX库

实验内容

实验一 —— 扫描转换算法

(●’◡’●) 效果展示
实验题1-1:绘制任意斜率的直线 计算机图形学实验_第1张图片
实验题1-3:用中点画圆法画圆 计算机图形学实验_第2张图片
实验题1-4:中点画圆法画椭圆 计算机图形学实验_第3张图片
实验题1-5:中点画圆法画圆弧 计算机图形学实验_第4张图片
实验题1-7:具有宽度的直线 计算机图形学实验_第5张图片
实验题1-8:具有宽度的圆和椭圆 计算机图形学实验_第6张图片

实验一中的代码并未进行优化,从截图可以看出,UI界面不够友好(毕竟刚学习这门课),操作起来比后面的实验更复杂


实验二 —— 裁剪算法

(●’◡’●) 效果展示
实验题2-1:Cohen-Sutherland算法实现直线段裁剪 计算机图形学实验_第7张图片
实验题2-2:Liang-Barsky算法实现直线段裁剪 计算机图形学实验_第8张图片
实验题2-5:综合算法实现多边形裁剪(自创) 计算机图形学实验_第9张图片

多边形裁剪:该算法实现了对任意多边形的裁剪,程序中设置多边形的顶点为固定的9个。算法上的实现分为三步:

  • 第一,先画裁剪框内的线段:用直线段裁剪算法对多边形进行裁剪,最后留下在裁剪框内的线段
  • 第二,画裁剪框四个顶点旁的线。先判断裁剪框的四个顶点是否在多边形内,具体判断方法是:过该顶点一条射线与多边形的每条线段相交,如果交点有奇数个,则在多边形内,反之则在多边形外。如果顶点在多边形内,那么它邻接的在裁剪框边上的点与它之间一定有连线
  • 第三,画裁剪框四条边上与顶点无交点的线段。取出在多边形外的四边形顶点,从这一点开始,往邻接的两条边方向画,得到该边和多边形线段的交点,然后画第奇数个到下一个点上的线段,若有奇数个点,则略去最后一个。例如:假设左下角的点在多边形外,则从该点向上和向右画,当向上画时,假如有5个交点(y1,y2,y3,y4,y5),则画线段(y1,y2),(y3,y4),y5则省略

实验三 —— 图形变换

(●’◡’●) 效果展示
实验题3-2:实现多步复合变换,并显示动画效果 计算机图形学实验_第10张图片
实验题3-3:任意直线的对称变换 计算机图形学实验_第11张图片

不足之处:各种二维变换在数学上理论上都能得到结果,但实现在程序里难免有舍入,会导致一些四边形放大倍数时,四边形的同一边可能有错位


实验四 —— 三维图形投影和消隐

(●’◡’●) 效果展示
实验题4-4和4-5:完成图形绕某一坐标轴旋转(包括三视图和正等轴测图) 计算机图形学实验_第12张图片

为了完成正十二面体的旋转,作者查了很多资料,最终得以实现,是一件很有趣的事情,如下是源码中坐标对应的点,如有需要可以参考
计算机图形学实验_第13张图片

不足之处:由于作者采用的消隐算法是外法线消隐算法,此算法只对凸多面体有效,这是该消隐算法的局限;且该消隐算法是按照每个面的边数都相等的多面体来具体实现的,于是对于由三角形和四边形等组成的混合型多面体无法在原有算法中实现,若有需要还得进一步修改


实验五 —— 曲线和曲面

(●’◡’●) 效果展示
实验题5-2绘制Bezier曲线 计算机图形学实验_第14张图片
实验题5-4绘制B样条曲面 计算机图形学实验_第15张图片

存在问题:Bezier曲线的代码中对点采用递归方式计算,当增加一个点时,需要对之前已经计算过的低阶Bezier函数重新进行计算,使得空间消耗和时间消耗增加(当时并未进行优化)。所以当点越来越多时,程序运行速度会大大降低,甚至可能程序崩溃(当有10几个点时)


实验源码

  • 下载方式一

本实验部分内容可通过资源下载,包含Bezier曲线和B样条曲面,正十二面体旋转——外法线消隐,直线和多边形裁剪等

  • 下载方式二

通过GitHub免费下载完整源码,click here

你可能感兴趣的:(计算机科学与技术,算法,图形学,计算机图形学,裁剪,消隐)