欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    计算机图形学课程设计报告实验报告.docx

    • 资源ID:10664212       资源大小:293.30KB        全文页数:29页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    计算机图形学课程设计报告实验报告.docx

    1、计算机图形学课程设计报告实验报告计算机图形学实验报告班级 计算机科学与技术 姓名 学号 2014 年 6 月 2 日实验一 基本图形生成算法一、实验目的: 1、掌握中点Bresenham绘制直线的原理; 2、设计中点Bresenham算法; 3、掌握八分法中点Bresenham算法绘制圆的原理; 4、设计八分法绘制圆的中点Bresenham算法; 5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理; 6、掌握下半部分椭圆偏差判别式的初始值计算方法; 7、设计顺时针四分法绘制椭圆的中点Bresenham算法。二、实验过程:1、实验描述 实验1:使用中点Bresenham

    2、算法绘制斜率为0=k=1的直线。 实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。 实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。2、实验过程 1)用MFC(exe)建立一个单文档工程; 2)编写对话框,生成相应对象,设置相应变量; 3)在类CLineView中声明相应函数,并在相关的cpp文件中实现; 4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆; 5)运行程序,输入相应值,绘制出图形。3、源代码实验1:直线中点Bresenham算法1./ cline.cpp : implementation file/ cline dialog

    3、cline:cline(CWnd* pParent /*=NULL*/) : CDialog(cline:IDD, pParent) /AFX_DATA_INIT(cline) m_x0 = 0; m_y0 = 0; m_x1 = 0; m_y1 = 0; /AFX_DATA_INITvoid cline:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(cline) DDX_Text(pDX, IDC_x0, m_x0); DDX_Text(pDX, IDC_y0, m_y0); DDX

    4、_Text(pDX, IDC_x1, m_x1); DDX_Text(pDX, IDC_y1, m_y1); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(cline, CDialog) /AFX_MSG_MAP(cline) /AFX_MSG_MAPEND_MESSAGE_MAP()2、/ LineView.hclass CLineView : public CViewpublic: CLineDoc* GetDocument(); . void Mbline(double,double,double,double); /直线中点Bresenham函数.3、/ Line.cp

    5、p /*直线中点Bresenham函数*/void CLineView:Mbline(double x0, double y0, double x1, double y1) CClientDC dc(this); COLORREF rgb=RGB(0,0,255); /定义直线颜色为蓝色 double x,y,d,k; x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k; for(x=x0;x=x1;x+) dc.SetPixel(int)x,(int)y,rgb); if(d0) y+; d+=1-k; else d-=k; 4、/LineView.cppvoid

    6、CLineView:OnDraw(CDC* pDC) CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here cline a; a.DoModal();/初始化 CLineView:Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1);实验2:圆中点Bresenham算法 1、/cricle.cpp/ Ccricle dialogCcricle:Ccricle(CWnd* pParent /*=NULL*/) : CDialog(Ccricle

    7、:IDD, pParent) /AFX_DATA_INIT(Ccricle) m_r = 0; /AFX_DATA_INITvoid Ccricle:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(Ccricle) DDX_Text(pDX, r_EDIT, m_r); /AFX_DATA_MAP 2、/CcircleView.hclass CCcircleView : public CView.public: CCcircleDoc* GetDocument(); void Circl

    8、ePoint(double,double); /八分法画圆函数 void Mbcircle(double); /圆中点Bresenham函数. 3、/CcircleView.cppvoid CCcircleView:OnDraw(CDC* pDC) CCcircleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here Ccricle r; r.DoModal(); CCcircleView:Mbcircle(r.m_r);/画圆4、/CcircleView.cpp/*八

    9、分法画圆*/void CCcircleView:CirclePoint(double x,double y) CClientDC dc(this); COLORREF rgb=RGB(0,0,255); dc.SetPixel(int)(300+x),(int)(300+y),rgb); dc.SetPixel(int)(300-x),(int)(300+y),rgb); dc.SetPixel(int)(300+x),(int)(300-y),rgb); dc.SetPixel(int)(300-x),(int)(300-y),rgb); dc.SetPixel(int)(300+y),(i

    10、nt)(300+x),rgb); dc.SetPixel(int)(300-y),(int)(300+x),rgb); dc.SetPixel(int)(300+y),(int)(300-x),rgb); dc.SetPixel(int)(300-y),(int)(300-x),rgb);/*圆中点Bresenham函数*/void CCcircleView:Mbcircle(double r) double x,y,d; COLORREF rgb=RGB(0,0,255); d=1.25-r; x=0; y=r; for(x=0;xy;x+) CirclePoint(x,y); /调用八分法

    11、画圆子函数 if(d0) d+=2*x+3; else d+=2*(x-y)+5; y-; 实验3:椭圆中点Bresenham算法1、/ellipse1.cpp/ Cellipse dialogCellipse:Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse:IDD, pParent) /AFX_DATA_INIT(Cellipse) m_a = 0; m_b = 0; /AFX_DATA_INITvoid Cellipse:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchang

    12、e(pDX); /AFX_DATA_MAP(Cellipse) DDX_Text(pDX, IDC_EDIT1, m_a); DDX_Text(pDX, IDC_EDIT2, m_b); /AFX_DATA_MAP2、/EllipseView.hclass CEllipseView : public CView.public: CEllipseDoc* GetDocument(); void EllipsePoint(double,double); /四分法画椭圆 void Mbellipse(double a, double b); /椭圆中点Bresenham函数.3、/Ellipse.c

    13、pp/*四分法画椭圆*/void CEllipseView:EllipsePoint(double x,double y) CClientDC dc(this); COLORREF rgb=RGB(0,0,255); dc.SetPixel(int)(300+x),(int)(300+y),rgb); dc.SetPixel(int)(300-x),(int)(300+y),rgb); dc.SetPixel(int)(300+x),(int)(300-y),rgb); dc.SetPixel(int)(300-x),(int)(300-y),rgb);/*椭圆中点Bresenham函数*/v

    14、oid CEllipseView:Mbellipse(double a, double b) double x,y,d1,d2; x=0; y=b; d1=b*b+a*a*(-b+0.25); EllipsePoint(x,y); while(b*b*(x+1)a*a*(y-0.5)/椭圆AC弧段 if(d10) if(d20) d2+=b*b*(2*x+2)+a*a*(-2*y+3); x+; else d2+=a*a*(-2*y+3); y-; EllipsePoint(x,y); 4、/EllipseView.cppvoid CEllipseView:OnDraw(CDC* pDC) C

    15、EllipseDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here Cellipse el; el.DoModal();/初始化 CEllipseView:Mbellipse(el.m_a, el.m_b);/画椭圆4、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二 有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。

    16、2、实验过程:1、实验描述 下图1 所示多边形覆盖了 12 条扫描线,共有 7 个顶点和 7 条边。7 个顶点分别为:P0(7,8) ,P1(3,12) ,P2(1,7) ,P3(3,1), P4(6,5), P5(8,1), P6(12,9)。在 1024768 的显示分辩率下,将多边形顶点放大为 P0(500,400) ,P1(350,600) ,P2(250,350),P3(350,50), P4(500,250), P5(600,50), P6(800,450)。请使用有效边表算法填充该多边形。2、实验过程 (1)建立AET类和Bucket类; (2)初始化桶,并在建立桶结点时为其表示

    17、的扫描线初始化为带头结点的链表; (3)对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环; (4)按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按X值递增的顺序进行排序,配对,以确定填充区间; (5)用指定颜色点亮填充区间内的所有像素,即完成填充工作。3、源代码1、/AET.hclass AET public: AET(); virtual AET(); double x; int yMax; double k;/代替1/k AET *next;/AET.cppAET:AET()AET:AET()2、 /Bucket.h#includ

    18、e AET.hclass Bucket public: Bucket(); virtual Bucket(); int ScanLine; AET *p;/桶上的边表指针 Bucket *next;/ Bucket.cppBucket:Bucket()Bucket:Bucket()3、/test2.cppvoid CTest2View:Et()/构造边表函数 for(int i=0;iPointi.y)/终点比起点高 while(CurrentB-Scanline!=Pointi.y)/在桶内寻找该边的yMin CurrentB=CurrentB-next;/移到下一个桶结点 Ei.x=Poi

    19、nti.x;/计算AET表的值 Ei.yMax=Pointj.y; Ei.k=double(Pointj.x-Pointi.x)/(Pointj.y-Pointi.y);/代表1/k Ei.next=NULL; CurrentE=CurrentB-p;/获得桶上连接边表的地址 if(CurrentB-p=NULL) CurrentE=&Ei;/边表的起始地址 CurrentB-p=CurrentE;/第一个边表直接连接到对应的桶中 else while(CurrentE-next!=NULL)/如果当前边已连有边结点 CurrentE=CurrentE-next;/移动指针到当前边的最后一个结

    20、点 CurrentE-next=&Ei;/把当前边接上去 if(Pointj.yScanline!=Pointj.y)/在桶内寻找该边的yMin CurrentB=CurrentB-next;/移到下一个桶结点 Ei.x=Pointj.x;/计算AET表的值 Ei.yMax=Pointi.y; Ei.k=double(Pointi.x-Pointj.x)/(Pointi.y-Pointj.y);/代表1/k Ei.next=NULL; CurrentE=CurrentB-p;/获得桶上连接边表的地址 if(CurrentE=NULL) CurrentE=&Ei;/边表的起始地址 Current

    21、B-p=CurrentE;/第一个边表直接连接到对应的桶中 else while(CurrentE-next!=NULL)/如果当前边已连有边结点 CurrentE=CurrentE-next;/移动指针到当前边的最后一个结点 CurrentE-next=&Ei;/把当前边接上去 CurrentB=NULL; CurrentE=NULL;void CTest2View:AddEdge(AET *NewEdge)/插入临时边表函数 T1=HeadE; if(T1=NULL)/边表为空,将边表置为TempEdge T1=NewEdge; HeadE=T1; else while(T1-next!=

    22、NULL)/边表不为空,将TempEdge连在该边之后 T1=T1-next; T1-next=NewEdge; void CTest2View:EdegeOrder()/对边表进行排序函数 T1=HeadE; if(T1=NULL) return; if(T1-next=NULL)/如果该边表没有再连边表 return;/桶结点只有一条边,不需要排序 else if(T1-next-xx)/边表按x值排序 T2=T1-next; T1-next=T2-next; T2-next=T1; HeadE=T2; T2=HeadE; T1=HeadE-next; while(T1-next!=NUL

    23、L)/继续两两比较相连的边表的x值,进行排序 if(T1-next-xx) T2-next=T1-next; T1-next=T1-next-next; T2-next-next=T1; T2=T2-next; else T2=T1; T1=T1-next; void CTest2View:PolygonFill()/多边形填充函数 CClientDC dc(this); COLORREF rgb=RGB(0,0,255); HeadE=NULL; for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB-next)/访问所有桶结点 for(Cur

    24、rentE=CurrentB-p;CurrentE!=NULL;CurrentE=CurrentE-next)/桶中所有结点 AET *TempEdge= new AET; TempEdge-x=CurrentE-x; TempEdge-yMax=CurrentE-yMax; TempEdge-k=CurrentE-k; TempEdge-next=NULL; AddEdge(TempEdge);/将该边插入临时Aet表 EdegeOrder();/边表按照x递增的顺序存放 T1=HeadE;/根据ymax抛弃扫描完的边结点 if(T1=NULL) return; while(CurrentB

    25、-Scanline=T1-yMax)/放弃该结点,Aet表指针后移,下闭上开 T1=T1-next; HeadE=T1; if(HeadE=NULL) return; if(T1-next!=NULL) T2=T1; T1=T2-next; while(T1!=NULL) if(CurrentB-Scanline=T1-yMax)/跳过一个结点 T2-next=T1-next; T1-next=NULL; T1=T2-next; else T2=T1; T1=T2-next; BOOL In=false;/设置一个BOOL变量In,初始值为假 double xb,xe;/扫描线的起点和终点 for(T1=HeadE;T1!=NULL;T1=T1-next)/填充扫描线和多边形相交的区间 if(In=false) xb=T1-x; In


    注意事项

    本文(计算机图形学课程设计报告实验报告.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开