计算机图形学课程设计报告.docx_第1页
计算机图形学课程设计报告.docx_第2页
计算机图形学课程设计报告.docx_第3页
计算机图形学课程设计报告.docx_第4页
计算机图形学课程设计报告.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学课程设计学生姓名:陈 育 伟 学 号:20096361 专业班级:信息与计算科学1班指导教师:霍 星 2012年6月28日实验一:点、线、圆、多边形等基本计算机图元的绘制实验目的:掌握点、线、圆、多边形等基本计算机图元的生成算法,并用C/WIN-TC/VC+实现算法。实验内容:Bresenham算法生成直线和圆,点和多边形绘制1、Bresenham算法生成直线算法思想:过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。设图中xi列上(xi,yi)作为表示直线的点,B点是直线上的点,其坐标为(xi+1,yi+1),它只能用下面两个象素点来逼近:C(xi+1,yi,) 、D(xi+1, yi+1,) 。y=m(xi+1)+b,d1=y-yi,d2=yi+1-y,若d1-d20,则yi+1=yi+1,否则d1-d20, yi+1=yi+1,Pi+1=Pi+2dy-2dx若Pi=0,yi+1=yi, Pi+1=Pi+2dy误差的初值P1,可将x1,y1,b=y1-mx1代入式得:P1=2dy-dx程序设源代码:#include #include#include void bresenham_line (x1, y1, x2, y2, c)int x1, y1, x2, y2, c;int dx,dy,x,y,p;int const1,const2;int inc,tmp;dx=x2-x1;dy=y2-y1;if(dx*dy=0)inc=1;elseinc=-1;if (abs(dx)abs(dy)if(dx0)/*将2a, 3a内的直线变到1a,4a象限方向*/tmp=x1;x1=x2;x2=tmp;tmp=y1;y1=y2;dx=-dx;dy=-dy;p=2*dy-dx;const1=2*dy;const2=2*(dy-dy);x=x1;y=y1;putpixel(x, y, c);while(xx2)x+;if(p0)p+=const1;elsey+=inc;p+=const2;putpixel(x, y, c);else/*将3b, 4b的直线变到2b,1b */if(dy0)tmp=x1;x1=x2;x2=tmp;tmp=y1;y1=y2;dx=-dx;dy=-dy;p=2*dx-dy;const1=2*dx;const2=2*(dx-dy); x=x1; y=y1; putpixel(x, y, c); while(yy2) y+; if(p0) p+=const1; else x+=inc; p+=const2; putpixel(x,y,c); void main()int x0,y0,x1,y1,c;int gd=DETECT,gm=0;initgraph(&gd,&gm, );printf(please input p0(x0,y0):);scanf(%d,%d,&x0,&y0);printf(please input p1(x1,y1):);scanf(%d,%d,&x1,&y1);printf(please input color c:);scanf(%d,&c);system(cls);bresenham_line(x0,y0,x1,y1,c);getch();closegraph();运行结果:2、Bresenham算法生成圆:算法思想:设圆的半径为r。先考虑圆心在(0,0),并从x=0、y=r开始的顺时针方向的1/8圆周的生成过程。若当前像素点是(xi,yi),则下一个像素可能是(xi+1,yi)或(xi+1,yi-1),若将xi+1带入圆的方程得出y值,考察精确值y靠近yi还是yi+1,选择靠近的点为下个像素点。选择判断:v y2=r2-(xi+1)2 v d21=yi2-y2=yi2-r2+(xi+1)2 v d22=y2-(yi-1)2=r2-(xi+1)2-(yi-1)2 v 令pi=d21-d22,并代入d21,d22,则有pi=2(xi+1)2+yi2+(yi-1)2-2r2 v pi称为误差。Pi+1的递归式为pi+1=pi+4xi+6+2(yi+12-yi2)-2(yi+1-yi) v 如果pi0则yi+1=yi,pi+1=pi+4xi+6,否则yi+1=yi-1, v pi+1=pi+4xi+6+2yi-1)2-yi2-2(yi-1-yi)=pi+4xi+6-4yi+2+2=pi+4(xiyi)+10v Pi的初值由式:pi=2(xi+1)2+yi2+(yi-1)2-2r2v 代入xi=0,yi=r而得p1=2+r2+(r-1)2-2r2=3-2r程序设源代码:#include#includevoid Circle(int xc,int yc,int radius,int c) int x,y,p; x=0; y=radius; p=3-2*radius; while(xy) putpixel(xc+x,yc+y,c);putpixel(xc-x,yc+y,c);putpixel(xc+x,yc-y,c);putpixel(xc-x,yc-y,c);putpixel(xc+y,yc+x,c);putpixel(xc-y,yc+x,c);putpixel(xc+y,yc-x,c);putpixel(xc-y,yc-x,c);if(p 1000#pragma once#endif / _MSC_VER 1000class SPPoint public:CPoint PCenterPoint;/点坐标/int PID; /点IDCOLORREF PointColor; /点颜色int PointStyle; /点类型SPPoint(CPoint point,COLORREF pc,int ps);SPPoint()virtual SPPoint();#endif / !defined(AFX_SPPOINT_H_F433DF25_AB93_4E46_9FD7_91A5B2763E9B_INCLUDED_)多边形的算法:#if !defined(AFX_SPPOLYGON_H_37CE9BA2_589B_49BB_B3DA_BB68555F86D8_INCLUDED_)#define AFX_SPPOLYGON_H_37CE9BA2_589B_49BB_B3DA_BB68555F86D8_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#includeusing namespace std;#include SPLine.hclass SPPolygon public:SPPolygon();virtual SPPolygon();void AddSPLine(SPLine line); void Clear();public:vector v_sppolygon;int line_number;COLORREF PolygonColor;int PolygonLS;int PolygonLW;vector v_PolygonColor; vector v_PolygonLS;vector v_PolygonLW;#endif / !defined(AFX_SPPOLYGON_H_37CE9BA2_589B_49BB_B3DA_BB68555F86D8_INCLUDED_)运行结果:实验二:平移、缩放、旋转等计算机图形的几何变换实验内容二维的平移变换:二维旋转变换:二维缩放变换:void Tmove(double x,double y,CPoint temp);/平移void Tscale(double x,double y,CPoint temp);/缩放void Trotate(CPoint); /旋转程序设计说明及源代码按照上面的算法,直接算出变换后点的点平移:void CLabView:Tmove(double x,double y,CPoint PolygonNode)for(int i=0;iPolygonNodeCount;i+)PolygonNodei.x=PolygonNodei.x+x;PolygonNodei.y=PolygonNodei.y+y;/Draw(P,ntype);缩放:void CLabView:Tscale(double x,double y,CPoint PolygonNode)/放大for(int i=0;iPolygonNodeCount;i+)PolygonNodei.x=PolygonNodei.x*x;PolygonNodei.y=PolygonNodei.y*y;旋转:其中BasePoint为旋转的中心void CLabView:Trotate(CPoint temp)CClientDC dc(this);int dx=temp.x-BasePoint.x;int dy=temp.y-BasePoint.y;double x,y;double dd=sqrt(dx*dx+dy*dy);double dcos=dx/dd;double dsin=dy/dd;for(int i=0;iPolygonNodeCount;i+)x=PolygonNodei.x-BasePoint.x;y=PolygonNodei.y-BasePoint.y;TempPolygoni.x=(int)(x*dcos-y*dsin+0.5);TempPolygoni.y=(int)(x*dsin+y*dcos+0.5);使用OpenGL的函数直接完成平移旋转等变换glTranslatef(glfloat, glfloat, glfloat);glRotatef(glfloat, glfloat, glfloat, glfloat );glScalef(glfloat , glfloat, glfloat, glfloat);运行结果:实验三:分形算法的实现实验内容:分形中的迭代函数系统 相似变换是指在各个方向上变换的比率必须相同的一种比例变换;仿射变换是指在不同的方向上变换的比率可以不同的一种比例变换。 仿射变换的数学表达式为: 其中,a,b,c,d,e,f是仿射变换系数。 对于比较复杂的图形,可能需要多个不同的仿射变换来实现,而且,每个仿射变换被调用的概率不一定相同,所以引进一个参数概率p。a,b,c,d,e,f,p就构成了一个IFS码。 分形中计算机模拟算法: 递归算法。 字符串替换算法。 迭代函数系统算法。 逃逸时间算法。 程序片段#ifndef _FRACTAL_H #define _FRACTAL_H #include #include class CFractal private: float m77; float a; float b; float c; float d; float e; float f; float x; float y; float newx; float newy; int n; public: CFractal(); virtual CFractal(); void ifs(CDC* pDC); ; #endif fractal.cpp文件: #include stdafx.h #include fractal.h CFractal:CFractal() memset(m,0,49); m00=-0.04; m01=0; m02=-0.19; m03=-0.47; m04=-0.12; m05=0.3;m06=0.25; m10=0.65; m11=0; m02=0; m13=0.56; m14=0.06; m15=1.56;m16=0.25; m20=0.41; m21=0.46; m22=-0.39; m23=0.61; m24=0.46; m25=0.4;m26=0.25; m30=0.52; m31=-0.35; m32=0.25; m33=0.74; m34=-0.48; m35=0.38;m36=0.25; x=0; y=0; a=0; b=0; c=0; d=0; e=0; f=0; newx=0; newy=0; n=300000; CFractal:CFractal() void CFractal:ifs(CDC* pDC) srand( (unsigned)time( NULL ) ); float r; while (n0) r=(double)rand()/RAND_MAX; char buffer100; if (r=m06) a=m00; b=m01; c=m02; d=m03; e=m04; f=m05; else if (r=(m06+m16) a=m10; b=m11; c=m12; d=m13; e=m14; f=m15; else if (rSetPixel( 300+100*x, 400-100*y, RGB(x*50*r,r*100,y*200*r); -n; 可以在此程序上扩展,实现其他的一些分形图。 调用: void CFractralView:Onfractral1() / TODO: 在此添加命令处理程序代码 CDC *pDC=GetDC(); CFractal *f=new CFractal(); f-ifs(pDC); ReleaseDC(pDC); 运行结果:实验四:曲线曲面的绘制实验目的:掌握基本曲线曲面的生成算法,并用C/WIN-TC/VC+实现算法,包括圆,椭圆,抛物线的生成算法,填充图形的生成算法和图形的裁剪算法等。实验内容:绘制圆与椭圆、抛物线1圆与抛物线、椭圆的生成算法 1.1生成圆弧的函数算法生成圆弧的最简单方法莫过于利用其函数方程,直接离散计算。中心在坐标原点,半径为R的圆的方程为。考虑第一象限内的八分之一圆弧,首先将区间0,以1个像素为单位离散得到,其中。再根据圆的方程求得,其中,则,为所求的像素集。建立成员函数如下:#includevoid CMy2_6View:sqrtCircle(CDC *pDC, int radius, int color) float x,y; x=0;y=radius; pDC-SetPixel(x,y,color); while(y=x) x+; y=sqrt(radius*radius-x*x); pDC-SetPixel(int)(x+0.5),(int)(y+0.5),color); 编写OnDraw函数如下:void CMy2_6View:OnDraw(CDC* pDC)CMy2_6Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data heresqrtCircle(pDC,300,RGB(0,0,0);运行结果:1.2生成圆弧参数算法 生成圆弧也可以利用其参数方程,。考虑第一象限内的八分之一圆弧。首先将区间按一定的步长离散得,再求相应的像素集为。建立成员函数如下:void CMy2_7View:funCircle(CDC *pDC, int radius, int color) float x,y,afla,pie; pie=3.1415926; x=radius;y=0;afla=0; pDC-SetPixel(x,y,color); while (aflaSetPixel(int)(x+0.5),(int)(y+0.5),color); 编写OnDraw函数如下:void CMy2_7View:OnDraw(CDC* pDC)CMy2_7Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here funCircle(pDC,300,RGB(0,0,0);运行结果:2. 用正负法作任意形状的抛物线:正负法的基本思想:假定要绘制的曲线的方程为F(x,y)=0,它具有正负划分性,即该曲线将平面分成了三个点集,分别记为:G+、G-、G。假定已获得起始点P0 G,当P0 沿某方向(如x轴)前进Dx时,就达到G+或G-中(设为G-)的P1 此时沿另一方向前进Dy,得到P2,若P2 G+,则改变前进方向,否则继续向G+前进,如此进行下去.这个程序算法的主要特色就是对正负法的思想进行了推广。使之能够处理画抛物线的问题,当然,也可能尝试作另外一些推广,如用正负法画椭圆。编写成员函数如下void CMy2_10View:PositiveNegativeParabola(CDC *pDC, float a, float b, float c, int color)int x,y,d; x=0; y=0; pDC-SetPixel(x+450+b,y+225+c,color); if(a0) y=1; pDC-SetPixel(x+450+b,y+225+c,color); d=1; while(y=0) d=d-2*a*x-a; x+; else d=d+1; y+; pDC-SetPixel(-x+450+b,y+225+c,color); pDC-SetPixel(x+450+b,y+225+c,color); else if(aSetPixel(x+450+b,y+225+c,color); d=1; while(y=-200) if(d=0) d=d-1; y-; else d=d-2*a*x-a; x+; pDC-SetPixel(-x+450+b,y+225+c,color); pDC-SetPixel(x+450+b,y+225+c,color); else printf(this is not a Parabola!n);编写OnDraw函数如下:void CMy2_10View:OnDraw(CDC* pDC)CMy2_10Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herePositive

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论