《计算机图形学》大作业项目汇报

合集下载

计算机图形学实验报告4

计算机图形学实验报告4

计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。

二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。

三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。

通过设置线条颜色、填充颜色等属性,增强图形的表现力。

2、图形的几何变换实现图形的平移、旋转和缩放操作。

观察不同变换参数对图形的影响。

3、三维图形的生成构建简单的三维模型,如立方体、球体等。

应用光照和材质效果,使三维图形更加逼真。

四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。

然后,定义绘图窗口的大小和坐标范围。

接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。

最后,设置图形的颜色和填充属性,使图形更加美观。

2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。

对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。

对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。

3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。

然后,设置光照的位置、颜色和强度等参数。

接着,为模型添加材质属性,如颜色、反射率等。

最后,使用渲染函数将三维模型显示在屏幕上。

五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。

例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。

2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。

在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。

3、三维图形的生成生成的三维模型具有一定的立体感和真实感。

计算机图形学作业报告

计算机图形学作业报告

计算机图形学第一次实验报告班级:1302 学号:******** 姓名:鱼朝伟2012年4月20日一.实验目的:设计和实现一个图形函数库,具有绘制直线段、任意圆弧、椭圆弧、多边形区域的阴影填充和颜色填充等功能。

(仅调用画点函数)二.实验接口:Windows API: setpixel(hdc,x,y,color)。

三.实验内容:(1)DDA算法画直线;(2)Bresenham算法画直线;(3)Bresenham算法画圆弧;(4)正负法算法画圆弧;(5)多边形逼近法画圆弧;(6)画椭圆弧;(7)多边形区域的阴影填充;(8)多边形区域的颜色填充。

四.实验步骤:1.DDA算法画直线:(1)算法描述:v oid CTETEView::DrawLine1(CPoint start,CPoint end){int x1 = start.x, y1 = start.y;int x2 = end.x, y2 = end.y;int i;float dx, dy, length, x = float(x1), y = float(y1);CClientDC dc(this);//计算直线长度if (fabs(x2-x1) >= fabs(y2-y1))length = float(fabs(x2-x1));elselength = float(fabs(y2-y1));//计算x轴和y轴增量dx = (x2-x1) / length;dy = (y2-y1) / length;//画直线for (i = 0; i <= length; i++){dc.SetPixel(int(x+0.5), int(y+0.5), m_clr);x += dx;y += dy;}}(2)实验结果:2.bresenham算法画直线:(1)算法描述:void CTETEView::DrawLine2(int x1,int y1,int x2,int y2){CClientDC dc(this);int i;int dx, dy, e, x, y;int deltay, deltax;dx = abs(x2 - x1);dy = abs(y2 - y1);if (dx >= dy) {e = 2 * dy - dx;if (x1 > x2) {swap(x1,x2);swap(y1,y2);}x = x1;y = y1;if (y1 > y2) deltay = -1;else deltay = 1;for (i = 0; i <= dx; i++) {dc.SetPixel(x,y,m_clr);x++;if (e >= 0) {//y++;y += deltay;e -= 2 * dx;}e += 2 * dy;}}else {e = 2 * dx - dy;if (y1 > y2) {swap(x1,x2);swap(y1,y2);}x = x1;y = y1;if (x1 > x2) deltax = -1;else deltax = 1;for (i = 0; i <= dy; i++) {dc.SetPixel(x,y,m_clr);y++;if (e >= 0) {//y++;x += deltax;e -= 2 * dy;}e += 2 * dx;}}}(2)实验结果:3.bresenham算法画圆弧:(1)算法描述:void CTETEView::DrawCircle1(int x0, int y0, int radius){int x = 0, y = radius, d = 3 - 2 * radius;while (x <= y) {CirclePoints(x0, y0, x, y);//画圆弧上的八个对称点if (d < 0) d += 4 * x + 6;else {d += 4 * (x - y) + 10;y--;}x++;}}void CTETEView::CirclePoints(int x0, int y0, int x, int y){CClientDC dc(this);dc.SetPixel(x0+x, y0+y, m_clr);dc.SetPixel(x0+y, y0+x, m_clr);dc.SetPixel(x0-x, y0+y, m_clr);dc.SetPixel(x0+y, y0-x, m_clr);dc.SetPixel(x0+x, y0-y, m_clr);dc.SetPixel(x0-y, y0-x, m_clr);dc.SetPixel(x0-y, y0+x, m_clr);}(2)实验结果:4.正负法画圆弧:(1)算法描述:void CTETEView::CirclePoints(int x0, int y0, int x, int y){CClientDC dc(this);dc.SetPixel(x0+x, y0+y, m_clr);dc.SetPixel(x0+y, y0+x, m_clr);dc.SetPixel(x0-x, y0+y, m_clr);dc.SetPixel(x0+y, y0-x, m_clr);dc.SetPixel(x0+x, y0-y, m_clr);dc.SetPixel(x0-y, y0-x, m_clr);dc.SetPixel(x0-x, y0-y, m_clr);}void CTETEView::DrawCircle2(int x0, int y0, int radius) {int x = 0, y = radius, f = 0;while (y > 0) {CirclePoints(x0, y0, x, y);if (f > 0) {f = f - 2 * y + 1;y--;}else {f += 2 * x + 1;x++;}}// if (y == 0) CirclePoints(x0, y0, x, y);}(2)实验结果:5.多边形逼近法画圆弧;(1)算法描述:void CTETEView::DrawCircle3(int x0, int y0, int radius){double x = float(radius), y = float(0);double dx = sin(PI/24), dy = cos(PI/24);double temp1, temp2;int i;for(i = 0; i <= 48; i++) {temp1 = x;temp2 = y;x = temp1 * dy - temp2 * dx;y = temp1 * dx + temp2 * dy;DrawLine2(int(temp1+0.5+x0),int(temp2+0.5+y0),int(x+0.5+x0),int(y+0.5+y0));}}(2)实验结果:6.画椭圆弧:(1)算法描述:void CTETEView::DrawEllipase(int x0, int y0, int a, int b){int aa = a*a, bb = b*b;int x = 0, y = b;int d = (int)(bb + aa*(0.25-b) + 0.5);int dx = 0, dy = 2*aa*y;CClientDC dc(this);//画对称的四个点dc.SetPixel(x0+x, y0+y, m_clr);dc.SetPixel(x0+x, y0-y, m_clr);dc.SetPixel(x0-x, y0+y, m_clr);dc.SetPixel(x0-x, y0-y, m_clr);//画椭圆的上部分while (dx < dy){x++;dx += 2*bb;if (d < 0) //取右方像素d += bb+dx;else //取右下方像素{dy -= 2*aa;d += bb+dx-dy;y--;}//画对称的四个点dc.SetPixel(x0+x, y0+y, m_clr);dc.SetPixel(x0+x, y0-y, m_clr);dc.SetPixel(x0-x, y0+y, m_clr);dc.SetPixel(x0-x, y0-y, m_clr);}d = (int)(bb*(x+0.5)*(x+0.5) + aa*(y-1)*(y-1) - aa*bb + 0.5);//画椭圆的下部分while (y > 0){y--;dy -= 2*aa;if (d > 0) //取下方像素d += aa-dy;else //取右下方像素{dx += 2*bb;d += aa-dy+dx;x++;}//画对称的四个点dc.SetPixel(x0+x, y0+y, m_clr);dc.SetPixel(x0+x, y0-y, m_clr);dc.SetPixel(x0-x, y0+y, m_clr);dc.SetPixel(x0-x, y0-y, m_clr);}}(2)实验结果:7.多边形的阴影填充:(1)算法描述:void CTETEView::DrawPolygon(CPoint point){//画外环if (CountPoint < m_nOut){CountPoint++;P1[CountPoint-1] = point;DrawLine1(P1[CountPoint-2],point);}if (CountPoint == m_nOut) {//画最后一条边DrawLine1(P1[0],point);if (m_nInner == 0) {CountPoint = 0;P1[9].x = m_nOut;P2[9].x = m_nInner;return;}}if((CountPoint > m_nOut) && (CountPoint-m_nOut < m_nInner)){CountPoint++;P2[CountPoint-m_nOut-1] = point;DrawLine1(P2[CountPoint-m_nOut-2],point);}if ((CountPoint-m_nOut) == m_nInner) //画最后一条边{DrawLine1(P2[0],point);CountPoint = 0;P1[9].x = m_nOut;P2[9].x = m_nInner;}}void CTETEView::OnShade(){// TODO: Add your command handler code herem_nDrawType = 8;CA TTR atr;atr.m_nAngle = m_nAngle;atr.m_nDistance = m_nDistance;if(IDOK == atr.DoModal()){m_nAngle = atr.m_nAngle;m_nDistance = atr.m_nDistance;if (P1[9].x == -1)MessageBox("图形不是多边形或多边形没有画完,不能进行阴影填充!","警告", MB_OK | MB_ICONW ARNING);}}void CTETEView::DrawShade(){float a = m_nAngle*PI/180;float k = -tan(a); //阴影线斜率//float db = m_nDistance/abs(cos(a));Calculate_B(k); //计算多边形棱边和棱边两顶点按阴影线斜率引线得到的截距swap(m_nclr,m_clr);int Bmin = B[0][0], Bmax = B[0][1];for (int i = 1; i < P1[9].x+P2[9].x; i++){if (B[i][0] < Bmin)Bmin = B[i][0];if (B[i][1] > Bmax)Bmax = B[i][1];}int deltab = int(m_nDistance / (fabs(cos(a))));//阴影线截距增量int b = Bmin+deltab; //第一条阴影线的截距//画阴影线部分for (; b < Bmax; b += deltab) //对每条阴影线{// InitD(); //初始化存放阴影线与各棱边的交点的数组int CountCross = 0; //交点个数for (int i = 0; i < P1[9].x+P2[9].x; i++){if (IsCross(i, b)){int xp, yp, xq, yq, xl, yl;xp = Edge[i].xp, yp = Edge[i].yp;xq = Edge[i].xq, yq = Edge[i].yq;//计算交点并存入D数组xl = int((xp*yq-yp*xq+b*(xq-xp)) / ((yq-yp)-k*(xq-xp)));yl = int(k*xl+b);D[CountCross][0] = xl;D[CountCross][1] = yl;CountCross++;}}if (CountCross > 1)SortCross(CountCross); //把所有交点按x递增是顺序进行排序for (int j = 1; j < CountCross; j += 2){int x1, x2, y1, y2;x1 = D[j-1][0];y1 = D[j-1][1];x2 = D[j][0];y2 = D[j][1];DrawLine2(x1, y1, x2, y2); //生成阴影线段}}swap(m_nclr,m_clr);}void CTETEView::Calculate_B(float k){int x, y, b1, b2, i;//处理外环棱边for (i = 0; i < P1[9].x-1; i++){Edge[i].xp = x = P1[i].x;Edge[i].yp = y = P1[i].y;b1 = int(y - k*x);Edge[i].xq = x = P1[i+1].x;Edge[i].yq = y = P1[i+1].y;b2 = int(y - k*x);if (b1 <= b2) //把较小的放在第一个存储单元,较大的放在第二个存储单元{B[i][0] = b1;B[i][1] = b2;}else{B[i][0] = b2;B[i][1] = b1;}}Edge[i].xp = x = P1[i].x;Edge[i].yp = y = P1[i].y;b1 = int(y - k*x);Edge[i].xq = x = P1[0].x;Edge[i].yq = y = P1[0].y;b2 = int(y - k*x);if (b1 <= b2){B[i][0] = b1;B[i][1] = b2;}else{B[i][0] = b2;B[i][1] = b1;}//处理内孔棱边if (P2[9].x != -1){for (i = 0; i < P2[9].x-1; i++){Edge[i+P1[9].x].xp = x = P2[i].x;Edge[i+P1[9].x].yp = y = P2[i].y;b1 = int(y - k*x);Edge[i+P1[9].x].xq = x = P2[i+1].x;Edge[i+P1[9].x].yq = y = P2[i+1].y;b2 = int(y - k*x);if (b1 <= b2){B[i+P1[9].x][0] = b1;B[i+P1[9].x][1] = b2;}else{B[i+P1[9].x][0] = b2;B[i+P1[9].x][1] = b1;}}Edge[i+P1[9].x].xp = x = P2[i].x;Edge[i+P1[9].x].yp = y = P2[i].y;b1 = int(y - k*x);Edge[i+P1[9].x].xq = x = P2[0].x;Edge[i+P1[9].x].yq = y = P2[0].y;b2 = int(y - k*x);if (b1 <= b2){B[i+P1[9].x][0] = b1;B[i+P1[9].x][1] = b2;}else{B[i+P1[9].x][0] = b2;B[i+P1[9].x][1] = b1;}}}void CTETEView::SortCross(int CountCross) {int pass, i, temp;//冒泡排序for (pass = 1; pass < CountCross; pass++){for (i = 0; i <= CountCross-pass-1; i++){if (D[i][0] > D[i+1][0]){temp = D[i][0];D[i][0] = D[i+1][0];D[i+1][0] = temp;temp = D[i][1];D[i][1] = D[i+1][1];D[i+1][1] = temp;}}}}BOOL CTETEView::IsCross(int i, int bj){int min = B[i][0];int max = B[i][1];if ((min <= bj) && (bj < max)) //相交return TRUE;else //不相交return FALSE;}(2)实验结果:8.多边形的颜色填充:(1)算法描述:void CTETEView::ColorFill( CPoint v,COLORREF color ){int i,j,Bmax = -0x7fffffff,Bmin = 0x7fffffff,Brange;int vsize = v.size();for(i = 0; i <= vsize - 1; i++){if(v[i].y > Bmax)Bmax = v[i].y;if(v[i].y < Bmin)Bmin = v[i].y;}Brange = Bmax - Bmin;EDGE** ET = new EDGE*[Brange];EDGE* AEL = NULL;EDGE* AELItr = NULL;EDGE* prevAELItr = NULL;CPoint drawPoint;for(i = 0; i <= Brange - 1; i++)ET[i] = NULL;for(i = 0; i <= vsize - 1; i++)if(v[i].y != v[(i+1)%vsize].y)//排除水平边InsertEdgeToET(v,ET,Bmin,v[i],v[(i+1)%vsize]);for(i = 0; i <= Brange - 1; i++){//把ET[i]接在AEL上,保持按X升序,x相同时按dtx升序if(AEL == NULL)AEL = ET[i];else if(ET[i] == NULL)AEL = AEL;elseMergeSortList(&ET[i],&AEL);//将AEL中x域两两配对,连水平线AELItr = AEL;while(AELItr != NULL && AELItr->next != NULL){drawPoint.y = i + Bmin;for(j = AELItr->x; j <= AELItr->next->x; j++){drawPoint.x = j;pDC->SetPixel(drawPoint,color);}AELItr = AELItr->next->next;}//扫描AEL,ymax为当前水平线截距的边删除//其余边执行:x += dtxAELItr = AEL;prevAELItr = AELItr;if(AELItr != NULL)//AEL链不为空{if(AELItr->next == NULL)//AEL链长为1{if(AELItr->ymax == i)//此边该被删除{delete AELItr;AELItr = NULL;AEL = NULL;}else//此边不该被删除AELItr->x += AELItr->dtx;}else//AEL链长>=2{while(AELItr != NULL){if(AELItr->ymax == i + Bmin)//要删除该节点{if(AELItr == AEL)//当前要删除的是头节点{prevAELItr = AELItr->next;AEL = prevAELItr;delete AELItr;AELItr = prevAELItr;}else//要删除的不是头结点{prevAELItr->next = AELItr->next;delete AELItr;AELItr = prevAELItr->next;}}else//不用删除{AELItr->x += AELItr->dtx;prevAELItr = AELItr;AELItr = AELItr->next;}}}}}}//将边插入边表ET中//包含非极值奇点预处理void CTETEView::InsertEdgeToET( CPoint v,EDGE** ET,int Bmin, CPoint p1,CPoint p2 ){if(p1.y > p2.y){CPoint ptmp = p1;p1 = p2;p2 = ptmp;}//以上保证p1为下端点p2为上端点int kind;if(GetIntersectNum(v,p1.y) == 2)kind = p1.y+1-Bmin;elsekind = p1.y-Bmin;//以上为非极值奇点预处理EDGE* tmp = new EDGE;tmp->ymax = p2.y;tmp->x = p1.x;tmp->dtx = (p2.x-p1.x)/double(p2.y-p1.y);tmp->next = NULL;EDGE *itr = ET[kind],*prev = itr;if(prev == NULL)//待插入的原链表为空ET[kind] = tmp;else//待插入的原链表非空{if(prev->x > tmp->x || prev->x == tmp->x && prev->dtx > tmp->dtx)//要插入在链表头{ET[kind] = tmp;tmp->next = prev;}else//不插入在链表头{itr = itr->next;while(itr != NULL && (itr->x < tmp->x || itr->x == tmp->x&& itr->dtx < tmp->dtx))//保持链表升序{prev = itr;itr = itr->next;}prev->next = tmp;tmp->next = itr;}}}//求水平线与多边形的交点数//v为多边形顶点集,b为水平线截距int CTETEView::GetIntersectNum( CPoint v,int b ){int i = 0;int iRval = 0;int vsize = v.size();for(i = 0; i <= vsize - 1; i++ ){if(v[i].y == b && v[(i+1)%vsize].y != b && v[(i-1 == -1 ?vsize - 1 : i-1)].y != b)iRval++;else if(v[i].y < b && v[(i+1)%vsize].y > b || v[i].y > b&& v[(i+1)%vsize].y < b)iRval++;}return iRval;}//将两条已排序的非空链表*l1,*l2归并排序//将排序后的链表接在*l2后//时间复杂度O(m+n)即表长之和//空间复杂度O(1)void CTETEView::MergeSortList( EDGE** l1,EDGE** l2 ){EDGE *s,*b,*tmp;s = *l1;b = *l2;if(s->x > b->x || s->x == b->x && s->dtx > b->dtx){tmp = s;s = b;b = tmp;}//s是第一个元素较小的链表头//b是第一个元素较大的链表头//且两条链表均非空EDGE *curs = s->next,*curb = b;EDGE *newHead = s;EDGE *newEnd = newHead;while(curs != NULL && curb != NULL){if(curb->x > curs->x || curb->x == curs->x &&curb->dtx > curs->dtx)//把curs接上{newEnd->next = curs;newEnd = newEnd->next;curs = curs->next;}else//把curb接上{newEnd->next = curb;newEnd = newEnd->next;curb = curb->next;}}if(curs == NULL)newEnd->next = curb;elsenewEnd->next = curs;*l2 = newHead;}(2)实验结果:五.说明:以上画图算法中,通过系统事件onMouseDown()识别动点,即当鼠标在对话框中点一下,系统就会识别一个点,读出该点的坐标,以供算法之用。

计算机图形学 实验报告(3)

计算机图形学 实验报告(3)

(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列 的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿 着初始中心旋转90度;最后沿着y轴平移100个单位。 四、实验结果与数据处理
1、矩形在窗口内沿着水平线匀速移动
代码如下:
实验结果如图示:
2、对一个三角形分别实现平移、缩放、旋转等变化 代码如下:
三、实验内容与步骤 本实验要求完成: 1、实现矩形在窗口内沿着水平线匀速移动; 2、已知某三角形的三顶点坐标为{50.0,25.0},{150.0,25.0},
{100.0,100.0}。 要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于 屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数, 使得绘制的三角形尽可能居中显示)
怀化学院数学实验中心
《计算机图形学》 实验报告
学 号实验Biblioteka 点姓 名指导教 师
年级、班 实验时间
实验三 二维图形的几何变换
一、实验目的 1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错
切变换; 2、掌握OpenGL中模型变换函数,实现简单的动画技术。
二、实验设备(环境)及要求 硬件:普通PC386以上微机; 软件:操作系统:Windows XP,Window7; 开发语言: Turbo C 、Visual C++ 6.0、OpenGl,或其它学生掌握 的高级语言。
结果如图示:
五、分析与讨论 通过本实验的学习,我了解了二维图形的基本几何变换,如平移、
旋转、缩放、对称、错切变换;了解了OpenGL中模型变换函数,实现
简单的动画技术,在老师同学的帮助下运用OpenGL实现了矩形在窗口 内沿着水平线匀速移动。

Dos界面计算机图形学画图

Dos界面计算机图形学画图

计算机图形学大作业报告课程名称:计算机图形学姓名:陶向东学号: 100511726 组员:任课教师:贾瑜成绩:1引言1.1 编写目的本学期计算机图形学课程期末大作业主要的开发项目就是基于DOS的基本图形的绘制、填充、变换,以及直线的裁剪。

实现语言VC++,编辑、调试环境VC++6.0。

此次大作业的完成是对计算机图形学基础知识的检验和测试,在撰写报告的过程中我能够更深刻地了解计算机图形学算法的思想,通过这份文档来记录我们在开发此软件的过程中遇到的问题以及改善的方法。

现在对整个开发过程加以认识、记录和总结,留下经验,汲取教训。

为以后的其他工作留下经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础。

1.2任务分工陶向东:实现直线、正三角形、矩形、椭圆的绘制,图形的边界标识填充算法,实现直线的裁剪算法。

2 程序框架2.1 程序模块本系统是一个基于DOS开发的实现能够基本图形的绘制、填充、变换,以及直线的裁剪的系统。

本系统中的功能模块主要分为以下几种:基本图形绘制模块:实现直线、矩形、圆、椭圆的绘制功能。

基本图形填充模块:实现矩形的填充功能。

基本图形裁剪模块:实现直线的裁剪功能。

程序框架如图2-1所示。

图2-1 程序框架图2.2程序功能接口接口名称:void drawLine(int xs,int ys,int xe,int ye,int value);功能说明:实现正负法画直线。

参数说明:xs,ys:起点坐标;xe,ye:终点坐标;value:画线颜色。

接口名称:void drawCircle(int x0,int y0,int r,int value);功能说明:实现正负法画圆。

参数说明:x0,y0:圆心坐标;r:半径;value:画圆颜色接口名称:void drawRectangle(int x0,int y0,int x1,int y1,int value); 功能说明:实现画矩形。

参数说明:x0,y0:矩形其中一个点的坐标;x1,y1:矩形对角点的坐标;value:画线颜色。

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)————————————————————————————————作者:————————————————————————————————日期:大作业报告实验课程名称:计算机图形学学生姓名:班级:学院(系):学生学号:指导教师:成绩:一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。

二、主要功能模块设计1 矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。

代码设计:float vv(float * v1, float * v2){return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}void vxv(float * n, float * v1, float * v2){n[0] = v1[1] * v2[2] - v1[2] * v2[1];n[1] = v1[2] * v2[0] - v1[0] * v2[2];n[2] = v1[0] * v2[1] - v1[1] * v2[0];}void loadIdentity(Matrix m){Matrix identity = {{1.0,0.0,0.0,0.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0},{0.0,0.0,0.0,1.0}};for(int i = 0;i < 4; i++)for(int j = 0;j < 4; j++)m[i][j] = identity[i][j];}void preMultiply(Matrix p, Matrix m){int i , j;Matrix t;for( i = 0; i < 4; i ++)for( j = 0; j < 4; j++)t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];for( i = 0; i < 4; i ++)for( j = 0; j < 4; j ++)m[i][j] = t[i][j];}2 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。

计算机图形学实验报告

计算机图形学实验报告

《计算机图形学》实验报告学号:0908610211姓名:宋雪英班级:计算机0961项目:1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

2.利用方形、线性两种画刷来绘制圆和椭圆。

3.实现交互式二维图形的放缩,旋转和对称变换2012年12月25日基本图形的生成技术一、实验目的在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。

所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。

本次实验的目的就是利用Bresenham 算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

利用方形、线性两种画刷来绘制圆和椭圆。

实现交互式二维图形的放缩,旋转和对称变换。

二、实验任务1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

2.利用方形、线性两种画刷来绘制圆和椭圆。

3.实现交互式二维图形的放缩,旋转和对称变换。

三、画直线的实验内容任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

1、设计思路第一步:建立DDAMouseLine工程文件;第二步:向视图类中添加自定义的成员变量用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。

proctected :CPoint m_p1; //起点CPoint m_p2; //起点CPoint m_p; //点击鼠标时点的取值第三步:向视图类中添加自定义的成员函数原型:public:V oid DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color);Line()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

计算机图形学大作业PPT

计算机图形学大作业PPT

本软件系统概述
Autodesk Maya是美国Autodesk公司出品的世界顶级的三维
动画软件,应用对象是专业的影视广告,角色动画,电影特技等。

Maya功能完善,工作灵活,易学易用,制作效率极高,渲染真实感极强,是电影级别的高端制作软件。

Maya
售价高昂,声名显赫,是制作者梦寐以求的制作工具,掌握了Maya,会极大的提高制作效率和品质,调节出仿真的角色动画,渲染出电影一般的真实效果,向世界顶级动画师迈进。

Maya 集成了Alias、Wavefront 最先进的动画及数字效果技术。

它不仅包括一般三维和视觉效果制作的功能,而且还与最先进的建模、数字化布料模拟、毛发渲染、运动匹配技术相结合。

在目前市场上用来进行数字和三维制作的工具中,Maya 是首选解决方案。

谢谢观赏
信息技术学院
宋红林084209135陈凯炜084209134。

计算机图形学大作业报告

计算机图形学大作业报告

云南大学软件学院期末课程报告Final Course ReportSchool of Software, Yunnan University个人成绩序号学号姓名成绩1学期: 2009年秋季学期课程名称: 计算机图形学任课教师:实践题目: 创建旋转体小组长:联系电话:电子邮件:2009-2010学年上学期计算机图形学成绩考核表年级:专业:软件工程学号:姓名:本人所做工作:创建旋转体总结报告(GB8567——88)1引言 ............................................................................................................... 错误!未定义书签。

1.1编写目的............................................................................................. 错误!未定义书签。

1.2背景..................................................................................................... 错误!未定义书签。

1.3定义..................................................................................................... 错误!未定义书签。

1.4参考资料............................................................................................. 错误!未定义书签。

2实际开发结果................................................................................................ 错误!未定义书签。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。

通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。

二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。

开发环境为 PyCharm。

三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。

它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。

Bresenham 算法则是一种基于误差的直线生成算法。

它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。

在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。

2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。

通过不断迭代计算中点的位置,逐步生成整个圆。

在实现过程中,需要注意边界条件的处理和误差的计算。

3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。

旋转变换是围绕一个中心点将图形旋转一定的角度。

缩放变换则是改变图形的大小。

通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。

4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。

扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。

在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。

四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。

根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。

计算机图形学大作业报告

计算机图形学大作业报告

《进化平衡球》项目报告17赵鸿宇2020年5月24日1项目概述《进化平衡球》是使用Unity3D制作的一款线性游戏,游戏流程约20分钟。

游戏采用极简美术风格,基本只使用Unity自带的球和方块搭建场景,使用的素材均为自制或可商用的免费素材。

虽然画面比较简陋,但具有优秀的游戏性和创意。

2游戏介绍本游戏的基础玩法源自《平衡球(Ballance)》,主要创意部分借鉴自《进化之地(Evoland)》,这里只说明其主要玩法:平衡球是一种玩家操控具有物理属性的小球进行运动,在不掉落的前提下到达终点的游戏;进化之地是一个RPG游戏,玩家在游玩过程中会逐渐解锁一些历史上出现过的RPG要素。

本游戏的开始玩家只能操控一个2D的黑白小球向前行走,但随着游戏的进行会解锁各种要素,直到最后操控着完整体的小球与具有十余种形态的BOSS进行激烈的弹幕战。

而与进化之地不同的是,本游戏的BOSS每变换一种形态,就会夺走一种之前解锁的要素,禁止跳跃、穿模摄像机……最终又回到2D场景,并且被剥夺了自由移动的能力,这个时候你的选择是……?3游戏部分要素说明更换材质更换材质是原版平衡球中的重要功能。

原版平衡球偏向解谜,所以设计上是到某个位置固定换某种材质;而我的游戏后期比较偏向动作,故13游戏部分要素说明2可以随时主动更换材质。

材质和原版完全一致,分为三种:木头,金属和纸。

三种材质具有不同的物理属性。

移动本游戏一开始只能使用WASD移动,后来增加了方向键,再后来需要同时使用两套操控模式加速,还是有一定操作感的。

虽然摩擦力和空气阻力因为时间原因没有写,但现在这样没有阻力其实也是一种方案。

跳跃本游戏中实现了三种不同的跳跃模式:普通,二段跳以及无限跳跃。

一般的跳跃的实现的主要问题是判断小球是否在地上,具体实现方法是向正下方发射一条短距离的射线。

二段跳的实现则借助计数器。

在特定位置经过复杂的操作(或者巧合的操作)可能会卡模型跳不起来或者跳的特别高,考虑到目前顶级的3D平台游戏(比如任天堂的那几个)也有同样的问题,我没有尝试解决它。

计算机图形学作业实验报告

计算机图形学作业实验报告

计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充一、实验目的了解多边形属性,熟悉相关函数的调用。

二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,glutDisplayFunc(Paint),paint函数中设置了两个三角形,一个填充,一个不填充。

用到了启用多边形点画模式glEnable(GL_POL YGON_STIPPLE)的函数,和指定多边形点画模式(填充) glPolygonStipple(fly)的函数。

另外一个就是循环执行OpenGl命令的glutMainLoop()函数。

三、实验结果四、源程序// POL Y_STIPPLE.C#include <gl/glut.h>void makeObject() // 定义一个三角形{ glBegin(GL_TRIANGLES); // 开始定义三角形// 按逆时针方向指定三角形的顶点坐标glVertex2f(-0.95, -0.95);glVertex2f(0.95, -0.95);glVertex2f(0, 0.95);glEnd(); // 三角形定义结束}void display(){ GLsizei w = glutGet(GLUT_WINDOW_WIDTH); // 程序窗口宽度GLsizei h = glutGet(GLUT_WINDOW_HEIGHT); // 程序窗口高度GLubyte fly[] = // 第二个三角形点画模式的mask值{ 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // 0X03, 0X80, 0X01, 0XC0, 0X06, 0XC0, 0X03, 0X60, //0X04, 0X60, 0X06, 0X20, 0X04, 0X30, 0X0C, 0X20, //0X04, 0X18, 0X18, 0X20, 0X04, 0X0C, 0X30, 0X20, //0X04, 0X06, 0X60, 0X20, 0X44, 0X03, 0XC0, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X66, 0X01, 0X80, 0X66, 0X33, 0X01, 0X80, 0XCC, //0X19, 0X81, 0X81, 0X98, 0X0C, 0XC1, 0X83, 0X30, //0X07, 0XE1, 0X87, 0XE0, 0X03, 0X3F, 0XFC, 0XC0, //0X03, 0X31, 0X8C, 0XC0, 0X03, 0X33, 0XCC, 0XC0, //0X06, 0X64, 0X26, 0X60, 0X0C, 0XCC, 0X33, 0X30, //0X18, 0XCC, 0X33, 0X18, 0X10, 0XC4, 0X23, 0X08, //0X10, 0X63, 0XC6, 0X08, 0X10, 0X30, 0X0C, 0X08, //0X10, 0X18, 0X18, 0X08, 0X10, 0X00, 0X00, 0X08 };glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glViewport(0, 0, w / 2, h); // 第一个视口,显示第一个三角形glColor3f(1, 1, 1); // 设置颜色,白色,默认值makeObject(); // 第一个三角形glViewport(w / 2, 0, w / 2, h); // 第二个视口,显示第二个三角形glColor3f(1, 0, 0); // 设置颜色,红色glEnable(GL_POL YGON_STIPPLE); // 启用多边形点画模式glPolygonStipple(fly); // 指定多边形点画模式(填充)makeObject(); // 第二个三角形glDisable(GL_POL YGON_STIPPLE); // 关闭多边形点画模式glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行}int main(){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);// 设置程序窗口的显示模式(单缓冲区、RGBA颜色模型)glutInitWindowPosition(100, 100); // 程序窗口的位置glutInitWindowSize(300, 150); // 程序窗口的大小glutCreateWindow("一个填充多边形的例子!"); // 窗口的标题glutDisplayFunc(display); // 指定场景绘制函数glutMainLoop(); // 开始循环执行OpenGL命令}实验二:基本图元绘制二、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

深圳大学计算机图形学大作业实验报告

深圳大学计算机图形学大作业实验报告
int Step;
int Qipan[8][8];
int nR;
int m_y;
int m_x;
int i_y[64];
int i_x[64];
2.部分算法源代码和截图:
(1)直线:
DDA算法:
ddaline (int x0,int y0,int x1,int y1,int color){
double dx, dy, x, y, m;
int xBuf, yBuf;
xBuf = x0; x0 = x1; x1 = xBuf;
yBuf = y0; y0 = y1; y1 = yBuf;
dx = -dx; dy = -dy;
}
if (dx >= (dy>0?dy:-dy)){
m = dy / dx;
y = y0;
for (x = x0; x <= x1; x++){
光照效应:三维图形的面着色;
分形几何:Koch雪花,L系统植物及其他有特色的图形学相关效果等。
二、开发环境:
MicroSoft VC++6.0
三、程序设计说明及源代码::
1.主要数据及函数
OnMxq()//消隐
On3py()//三维平移
On3sf()//三维缩放
On3xz()//三维旋转
CohenSutherlandLineClip(float x0, float y0,float x1,float y1,CRect *rect)// C—S线段剪裁
Horse_Move(int a, int b)//马移动一步
CircleBresenham(CPoint center, int r)//Bresenham画圆

图形学大作业范例

图形学大作业范例

滁州学院图形学设计报告课程名称:计算机机图形学设计题目:简单图形绘制软件的设计与实现系别:计算机科学与技术系专业:姓名:起止日期:2011年5月20日~ 2011年6月20日指导教师:计算机科学与技术系二00九年制目录⒈引言 (1)⒉需求分析 (1)⒊概要设计 (1)3.1概要设计实现的内容 (1)3.2函数的功能描述 (1)⒋详细设计 (2)⒌调试与操作说明 (4)⒍课程设计总结与体会 (6)⒎致谢 (6)⒏参考文献 (6)⒐附录 (7)课程设计的主要内容⒈引言本学期系统的学习了计算机图形学,在学期末按课程要求对其进行设计,本课程主要内容包括以图形学算法为目标,深入研究。

续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。

通过完成一个完整程序,经历策划、设计、开发、总结。

达到通过本课程设计,使自己巩固和实践计算机图形学课程中的理论和算法;掌握基本图形显示程序设计方法,及二维和三维图形变换等程序设计方法,学习表现计算机图形学算法的技巧。

同时以达到培养认真学习积极探索的精神。

⒉需求分析图形学设计报告题目:地球与卫星模拟图。

图形学设计报告任务及要求:以计算机图形学的研究内容、发展与应用,实现图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,光照模型,颜色模型,光线跟踪,纹理模拟,常用的计算机动画技术和软件等。

课程设计思想:绘制一个地图与卫星模拟图,在此中综合实现本学期中学习到OpenGL编程中大部分的方法与操作。

软硬件运行环境:Microsoft Windows XP。

工发工具:VC++ 6.0。

⒊概要设计3.1概要设计实现的内容利用VC++ 6.0完成了一个地图与卫星模拟图,该模拟图能实现基本的图形操作功能。

通过本次实验,应该了解图形学里使用OpenGL的一些基于操作,了解直线、矩形、圆和Bezier曲线和曲面等图形的绘制原理、旋转原理、移动原理和缩放原理等。

计算机图形学实验报告三

计算机图形学实验报告三

《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。

}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国科学技术大学《计算机图形学》大作业项目汇报
扫地机器人
顾欣玮1葛子恒1冯睿蠡1
1中国科学技术大学2014级数学科学学院
【元件】
单片机×1
电机×2
超声波测距仪×1
红外信号接收器×1
遥控器×1
轮胎×2
万向轮×1
简易清洁装置(DIY)
【项目介绍】
我们通过超声波探测器,红外遥控接收装置和两个电机实现在不预先知道区域形状条件下的遍历多连通区域。

考虑到现实的可操作性,我们设计了共计2种算法来实现这一功能。

【项目制作与设计】
算法1:蒙特卡洛式扫地
区域形状任意,初始位置任意,在碰到障碍物或者墙壁后,随机偏转一个角度,继续前进,直至给定时间。

对于不是很复杂的区域尤其是单连通区域有很高的清扫效率。

算法2:按行遍历式扫地
区域形状在x方向上为凸的,初始位置在y方向上最低处,车的行进方向与x轴同向。

算法流程:
(a)
(1)检测左方是否有障碍物,无则左行直至遇到障碍物,有则进入(2)
(2)检测右方是否有障碍物,无则右行直至遇到障碍物
(b)遇到障碍物后,执行:
(1)右方遇到障碍物,且y方向上前方无障碍,则向y方向前进一小段距离,
左转回到(a)
(2)左方遇到障碍物,且y方向上前方无障碍,则向y方向前进一小段距离,右转回到(a)
(3)左或右方有障碍物,且y方向上前方有障碍物,则左转90°,把x,y轴对调,回到(a)继续执行,直至第二次遇到左或右方有障碍物,且y方向上前方有障碍物时停止。

对于在x方向上凸的多连通区域,基本可以遍历,实际操作中,要求区域尽量简单,否则多次转向累计的误差可能很大。

【项目分工】
我们小组由三人组成
顾欣玮负责小车的拼装与电路连接
冯睿蠡及葛子恒负责算法设计,以及对算法的实验修正
【感想与不足】
由于时间和经验的不足,以下诸方面没有制作完善:
●缺少相关的经验,没有充分考虑到实际情况,初始设计的许多算法在实
际运行中效果极为不理想
●小车有时会出现不走直线的现象,这时对整个算法的实现由巨大威胁
●没有去实现一些更为复杂的算法,主要时间花费在调试小车的各种bug
上,对adiuno的编程语言存在许多疑惑
【致谢】
中国科学技术大学创客实验室为本项目提供了大量支持。

相关文档
最新文档