计算机图形学实验报告
- 格式:doc
- 大小:166.00 KB
- 文档页数:14
《计算机图形学》实验2实验报告实验题目:多视图绘图程序实验内容:掌握多视图绘图的概念,掌握二维统计图的绘制方法。
调用实验1中自己编写的基本包,绘制自己所设计的统计图形(饼图、直方图以及折线)。
编写程序调用验证之。
基本概念:(详细叙述自己对实验内容的理解)多视图:就是将多个绘制好的图形按照一定的规则组成一个具有特定意义的图形,在同一个视图中显示出来,如下面绘制的几种统计图形(饼图、直方图以及折线)。
饼图:可以清楚的表示出各个部分所占的比例;直方图:可以清楚地的显示各部分的数量的多少;折线:可以清楚地反应各个部分的变化趋势。
算法设计:(详细叙述自己设计的多视图统计图以及程序的功能、算法及实现)public abstract void drawLine(int x1, int y1, int x2, int y2)使用当前颜色,在点(x1, y1) 和(x2, y2) 之间画线。
public abstract void drawOval(int x, int y, int width, int height)画椭圆。
public abstract void fillOval(int x, int y, int width, int height)画实心椭圆。
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)画x和y坐标定义的多边形。
public void drawRect(int x, int y, int width, int height)画矩形。
public void drawRect(int x, int y, int width, int height)画实心矩形。
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 使用当前颜色画圆角矩形。
《计算机图形学》实验报告1. 实验目的巩固对计算机图形学绘图基础知识,绘制金刚石图案2. 问题描述对题目分析,金刚石图案是由依次连接位于圆上的不同等分点的直线段构成,等分点越多,金刚石图案越复杂;要绘制一个半径300,20等分的金刚石图案;首先要设计金刚石图案的数学模型,然后定义画笔编程绘制图案;。
3. 算法的思想为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1.以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。
4.程序核心代码void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect 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);CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);double thta;thta=2*PI/20;CPoint p[20];for(int i=0;i<20;i++){p[i].x=100*cos(i*thta);p[i].y=100*sin(i*thta);}for(i=0;i<=18;i++){for(int j=i+1;j<=19;j++){pDC->MoveTo(ROUND(p[i].x),ROUND(p[i].y));pDC->LineTo(ROUND(p[j].x),ROUND(p[j].y));}}pDC->SelectObject(pOldPen);NewPen.DeleteObject();ReleaseDC(pDC);}5.程序运行结果6.实验总结初次用C+ +绘图,看到是绘制金刚石,第一感觉是一定很复杂;其实不然,由于老师简化了实验题目要求,使我们的实验任务得以轻松了很多;但是好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,实验指导书上模型都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果,最后在同学的帮助下运行改错才得出结果;通过这次实验我了解到问题的难与易在于你是否动手实际操作了,有时看似简单永远不知道在哪个细节会出错!。
计算机图形学实验报告姓名:___ __________学号:_____ ________班级:______ _______时间:_____2016年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。
学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。
当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。
OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。
OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。
了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。
3.实验代码及结果3.1点的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glPointSize(10); //三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.2直线的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_LINE_LOOP); //五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.3多边形面的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_TRIANGLES); //等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。
计算机图形学与三维建模实验报告计算机图形学实验报告openGL的基本使用1.项目代码:// 2321321.cpp : 定义控制台应用程序的入口点。
#include"stdafx.h"#include<iostream>#include<stdio.h>#include<gl/glut.h>#include<gl/glu.h>#include<gl/gl.h>using namespace std;//#include"vgl.h" opengl4.3 编程宝典第8版库函数//#include"loadshaders.h"GLfloat x=0.0,y=0.0,z=0.0;//用于平移的变量GLfloat i=1.0,j=1.0,k=1.0;//用于缩放的变量int d=1;//用于是否判断旋转的开关GLfloat angle=0.0f;//旋转角度的变量void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 创建透视效果视图glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 定义4光源,从4个方向入射,第一个是白光,其他为红绿蓝{GLfloat sun_light_position[] = { -5.0f, 5.0f, 0.0f, 1.0f };GLfloat sun_light_position1[] = { 5.0f, 5.0f, 0.0f, 1.0f };GLfloat sun_light_position2[] = { -5.0f, -5.0f, 0.0f, 1.0f };GLfloat sun_light_position3[] = { 5.0f, -5.0f, 0.0f, 1.0f };GLfloat sun_light_ambient[] = { 0.0f, 0.0f, 0.0f,1.0f };GLfloat sun_light_diffuse[] = { 1.0f, 1.0f, 1.0f,1.0f };GLfloat sun_light_diffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f };GLfloat sun_light_diffuse2[] = { 0.0f, 1.0f, 0.0f, 1.0f };GLfloat sun_light_diffuse3[] = { 0.0f, 0.0f, 1.0f, 1.0f };GLfloat sun_light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };glLightfv(GL_LIGHT0, GL_POSITION,sun_light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT1, GL_POSITION,sun_light_position1);glLightfv(GL_LIGHT1, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, sun_light_diffuse1);glLightfv(GL_LIGHT1, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT2, GL_POSITION, sun_light_position2);glLightfv(GL_LIGHT2, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT2, GL_DIFFUSE, sun_light_diffuse2);glLightfv(GL_LIGHT2, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT3, GL_POSITION, sun_light_position3);glLightfv(GL_LIGHT3, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT3, GL_DIFFUSE, sun_light_diffuse3);glLightfv(GL_LIGHT3, GL_SPECULAR,sun_light_specular);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_LIGHT2);glEnable(GL_LIGHT3);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);}//绘制坐标轴{glBegin(GL_LINE);//x轴红色glColor3f(1,0,0);glVertex3f(10,0,0);glVertex3f(-10,0,0);//y轴绿色glColor3f(0,1,0);glVertex3f(0,10,0);glVertex3f(0,-10,0);//z轴蓝色glColor3f(0,0,1);glVertex3f(0,0,10);glVertex3f(0,0,-10);glEnd();}// 定义球体的材质并绘制{GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };//环境颜色GLfloat diffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };//散射GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//镜面反射GLfloat emission[] = { 0.0f, 0.0f, 0.0f, 0.5f };//发射光颜色GLfloat hininess = 50.0f; //反射指数glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialfv(GL_FRONT, GL_EMISSION, emission);glMaterialf(GL_FRONT, GL_SHININESS, shininess);glTranslatef(x,y,z);glScalef(i,j,k);if(d==1){glRotatef(angle,0.0f,0.0f,4.0f);glTranslatef(2.5f,2.5f,0.0f);}glutSolidSphere(2.0, 60.0, 60.0);}glutSwapBuffers();}void ChangeSize(GLsizei W,GLsizei H)//当视口改变时改变裁剪部分保证图形观察时不形变{GLfloat aspectRatio;if(H==0)H=1;glViewport(0,0,W,H);//视口设置glMatrixMode(GL_PROJECTION);//重置坐标系统glLoadIdentity();aspectRatio=(GLfloat)W/(GLfloat)H;if(aspectRatio<=1)//裁剪部分设置glOrtho(-2.5,2.5,-2.5/aspectRatio,2.5/aspectRatio,2.5,-2.5);elseglOrtho(-2.5*aspectRatio,2.5*aspectRatio,-2.5,2.5,2.5,-2.5);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void ProcessKeys(unsigned char ch,int a,int b){if(ch==119)//w{y+=0.1;glutPostRedisplay();}else if(ch==115)//s{y-=0.1;glutPostRedisplay();}else if(ch==97)//a{x-=0.1;glutPostRedisplay();}else if(ch==100)//d{x+=0.1;glutPostRedisplay();}else if(ch==120)//x{z-=0.1;}else if(ch==122)//z{z+=0.1;glutPostRedisplay();}else if(ch==43)//+{i+=0.1;j+=0.1;k+=0.1;glutPostRedisplay(); }else if(ch==45)//-{i-=0.1;j-=0.1;k-=0.1;}else if(ch==32)//空格键{if(d==0)d=1;else d=0;cout<<d<<endl;}//按空格开关旋转}void IdleFunc(){if(d==1){angle+=1.0f;if(angle==360.0f){angle=0.0f;}cout<<angle<<endl;myDisplay();}}int _tmain(int argc, char* argv[]){glutInit(&argc, (char**) argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100);glutInitWindowSize(500,500);glutCreateWindow("Hello OpenGL");glutDisplayFunc(myDisplay);glutReshapeFunc(ChangeSize);glutIdleFunc(IdleFunc);glutKeyboardFunc(ProcessKeys);glutReshapeFunc(ChangeSize);glutMainLoop();return 0;}二.系统总体布局系统流程图:本系统是常规的openGL系统,初始化后先设置视角、投影、光照、材质等因素,绘制基本的图形,再通过函数判断键盘输入进行重复绘制,完成基本的平移,缩放,旋转等操作三.系统设计思路在系统设计最初,本来想直接使用默认视角后直接设置光照和平移旋转等功能,但是发现在默认视角下对物体,特别是正方体的三维效果无法很好地观察,因此采用侧视视角然后在对材质的定义上,由于立方体设置比较麻烦,最后决定画一个球体,然后在平移旋转缩放等功能的演示上,直接演示过于简单,就是一个函数的执行,因此决定采取利用键盘控制移动和缩放及旋转的方式。
计算机图形学实验报告计算机图形学实验报告学号:姓名:⼀、Bresenham算法1、算法思想:1画起点(x1, y1); 2.准备画下⼀个点,X坐标加1,判断如果达到终点,则完成。
否则找下⼀个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。
2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标⼤于(y+*y+1))/2则选右上那个点2.2.否则选右下那个点;3.画点;4.跳回第2步; 5.结束。
2、优点:Bresenham算法也是采⽤递推步进的办法,但与简单DDA 算法不同,它是根据⼀个简单的判别式来判断在另⼀个⽅向上是否也需要步进⼀个单位,这样就避免了许多实数运算。
3、运⾏结果:⼆、中点Bresenham算法画圆1、算法思想:1、赋初值:x=0,y=R,d=3-2R;2、画点(x,y)(同时画8个点);3、若d<0,则d=d+4x+6,否则d=d+4(x-y)+10,y=y-1;4、赋值:x=x+1;5、若x2、优点:将⼀个象限内的相邻⼋分圆弧对于分割两个部分的四⼗五度是对称的,利⽤园对称性的这种⽅法仅需计算从x=0到x=y段内的点就可得到整个园的所有像素位置,但计算时间仍很⼤,⽤Bresenham 画线算法以决策参数的增加量计算为基础,仅包括简单的整数操作。
3、运⾏结果:三、编程实现绘制⼀段三次Bezier曲线1、理解:Bezier曲线通过控制曲线上的四个点(起始点、终⽌点以及两个相互分离的中间点)来创造、编辑图形。
其中起重要作⽤的是位于曲线中央的控制线。
这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。
移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终⽌点锁定的情况下做均匀移动。
2、对两个端点的编码进⾏逻辑与运算:若结果为⾮零,则线段全部在裁剪窗⼝之外,舍弃,否则,若全为零,则线段全在窗⼝内,可直接接受;3、否则,求线段与窗⼝边的交点,舍弃在裁剪窗⼝外同侧的部分线段,对留下的线段重新执⾏2步骤。
图形学的建立具有重要的意义。
近年来,计算机图形学在如下几方面有了长足的进展。
1 智能CADCAD 的发展也显现出智能化的趋势,就目前流行的大多数CAD 软件来看,主要功能是支持产品的后续阶段一一工程图的绘制和输出,产品设计功能相对薄弱,而新一代的智能CAD 系统可以实现从概念设计到结构设计的全过程。
因此,基于光电扫描仪的图纸自动输入方法已成为国内外CAD工作者的努力探索的新课题。
2 计算机美术与设计2.1 计算机美术的发展1952年,美国的Ben .Laposke用模拟计算机做的波型图《电子抽象画》预示着电脑美术的开始(比计算机图形学的正式确立还要早)。
计算机美术的发展可分为三个阶段:(1)早期探索阶段(1952 1968年)主创人员大部分为科学家和工程师,作品以平面几何图形为主。
(2)中期应用阶段(1968年~1983年)以1968年伦敦第一次世界计算机美术大展一“控制论珍宝 (Cybernehic Serendipity1为标志,进入世界性研究与应用阶段;计算机与计算机图形技术逐步成熟,一些大学开始设置相关课题,出现了一些CAD应用系统和成果,三维造型系统产生并逐渐完善。
(3)应用与普及阶段(1984年~现在)以微机和工作站为平台的个人计算机图形系统逐渐走向成熟,大批商业性美术(设计)软件面市;以苹果公司的MAC 机和图形化系统软件为代表的桌面创意系统被广泛接受,CAD成为美术设计领域的重要组成部分。
2.1计算机设计学(Computer Des i gn i cs)包括三个方面:环境设计(建筑、汽车)、视觉传达设计(包装)、产品设计。
CAD对艺术的介入,分三个应用层次:(1)计算机图形作为系统设计手段的一种强化和替代;效果是这个层次的核心(高精度、高速度、高存储)。
(2)计算机图形作为新的表现形式和新的形象资源。
(3)计算机图形作为一种设计方法和观念。
3 计算机动画艺术3.1 历史的回顾计算机动画技术的发展是和许多其它学科的发展密切相关的。
实验一OpenGL开发环境及扫描转换算法1、实验目的与要求1.通过实验掌握OpenGL中编程环境的设置,了解相关函数用途及设置步骤;2.通过实验掌握基本图形元素的生成,给出相关代码和运行结果;3.用WINDOWS GDI函数编写生成直线或区域填充的程序(选DDA或Bresenham直线算法,活性边表算法填充多边形),演示算法过程。
4.画矩形,调用一个函数画一个矩形。
画椭圆,调用一个函数画一个椭圆。
画Bezier 曲线。
2、实验方案请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。
在工程WinAPIEX加入void createLine(HDC tmpDC)和void Polyline (tmpDC)在void createLine(HDC tmpDC)用DDA直线算法或Bresenham直线算法生成直线在void Polyline (tmpDC)添加活泩边表填充算法,生成填充四边形和八边形加入Rectangle(tmpDC,x0,y0,x1,y1);加入Ellipse (tmpDC, x0,y0,a,b) ;加入PolyBezier(tmpDC,arr_vertex,4) ;3、实验结果和数据处理1)生成直线的DDA直线算法在createLine(tmpDC)中加入以下代码int x0,y0,x1,y1,color; //自定义直线的起点(x0,y0)和终点(x1,y1),及颜色colorfloat dx,dy,x,y;int length,i;x0=50;y0=160;x1=900;y1=200;//此处修改了color=1000; color=1;if(abs(x1-x0)>=abs(y1-y0))length=abs(x1-x0);elselength=abs(y1-y0);dx=(x1-x0)/(float)length;dy=(y1-y0)/(float)length;i=1;x=(float)x0;y=(float)y0;while(i<=length){SetPixel(tmpDC,int(x+0.5),int(y+0.5),color);x+=dx;y+=dy;i++;}2)区域填充的程序在void Polyline (tmpDC) 添加活性边表填充void Polyline (HDC tmpDC) //多边形边数.{const int POINTNUM=4;//或者是八边形8/******定义结构体用于活性边表AET和新边表NET***************************** ******/typedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;/******定义点结构体point**************************** **************************/struct point{float x;float y;}polypoint[POINTNUM]={100,10 0,400,100,400,400,100,400};//正方形//polypoint[POINTNUM]={600,10 0,700,100,800,200,800,300,700,400,600, 400,500,300,500,200};//八边形顶点/******计算最高点的y坐标(扫描到此结束)****************************** **********/int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY) MaxY=(int)polypoint[i].y;/*******初始化AET表********************************* **************************/AET *pAET=new AET;pAET->next=NULL;/******初始化NET表********************************* ***************************/NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}/******扫描并建立NET表********************************* ************************/for(i=0;i<=MaxY;i++){for(intj=0;j<POINTNUM;j++)if(polypoint[j].y==i){if(polypoint[(j-1+POINTNUM)%POINT NUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%P OINTNUM].x-polypoint[j].x)/(polypoint [(j-1+POINTNUM)%POINTNUM].y-po lypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POIN TNUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)% POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}/******建立并更新活性边表AET***************************** ************************/for(i=0;i<=MaxY;i++){//计算新的交点x,更新AET***************************** ***************************/NET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}//更新后新AET先排序********************************* ****************************///断表排序,不再开辟空间AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点********************************* *******/AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序********************************* */p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}/******配对填充颜色********************************* ******************************/p=pAET->next;while(p && p->next){for(floatj=p->x;j<=p->next->x;j++){SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,200,0));//此处我改变了颜色,八边形的为黄色//SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,0,0));//还有四边形的红色}p=p->next->next;//考虑端点情况}} }//画矩形Rectangle(tmpDC,20,20,80,80); //左上顶点,右下顶点//画椭圆Ellipse (tmpDC, 20,20,160,360) ;//画Bezier 曲线,利用已有的顶点数据PolyBezier(tmpDC,arr_vertex,4) ;实验截图:1.DDA算法的直线2.四边形和八边形3.正方形4.椭行5.Bezier 曲线实习总结:通过本次实验,我掌握了opengl绘图的一些基本知识,会在vc里面加入opengl的基本库。
一、实验目的1、掌握中点 Bresenham直线扫描转换算法的思想。
2 掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。
3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。
4掌握三维形体在计算机中的构造及表示方法二、实验环境Windows 系统 , VC6.0。
三、实验步骤1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点 Bresenham直线扫描转换算法画出连接两点的直线。
实验基本步骤首先、使用 MFC AppWizard(exe)向导生成一个单文档视图程序框架。
其次、使用中点 Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下:void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y);在函数中,可通过调用 CDC 成员函数 SetPixel 来画出扫描转换过程中的每个点。
COLORREF SetPixel(int x, int y, COLORREF crColor );再次、找到文档视图程序框架视图类的OnDraw 成员函数,调用 DrawLine 函数画出不同斜率情况的直线,如下图:最后、程序直至正确画出直。
2、定多形的点的坐P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4 )⋯使用志算法或有效表算法行多形填充。
基本步首先、使用 MFC AppWizard(exe)向生成一个文档程序框架。
其次、志算法或有效表算法函数,如下:void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb);px:数用来表示每个点的x 坐py :数用来表示每个点的 y 坐ptnumb:表示点个数注意函数FillPolygon可以直接通窗口的DC(描述符)来行多形填充,不需要使用冲存。
报告内容概述●概述:计算机图形学的概念/发展历史/中国计算机图形学的发展/著名公司●技术章节:计算机图形学的一般框架/研究内容/相关技术算法●人才文章:领导人物/骨干力量/年轻学者●会议文章:在各地举行的会议●应用:计算机图形学在各个领域的应用●趋势:计算机图形学的发展趋势1.概述1.1计算机图形学的概念(1)什么是计算机图形学?关于计算机图形的定义有不同的意见。
IEEE将计算机图形学定义为:计算机图形学是借助计算机生成图形图像的艺术或科学。
国际标准化组织(ISO)将计算机图形定义为:计算机图形学是一门研究计算机,将数据通过计算机转换为图形并将其显示在特殊显示设备上的原理,方法和技术的学科。
它是基于传统图形理论,应用数学和计算机科学的边缘学科。
综上所述,计算机图形学是研究如何通过计算机显示,生成和处理图形的原理,方法和技术的学科。
图形在这里是指3D图形的处理。
(2)相关概念的区别计算机图形学的基本含义是使用计算机通过算法和程序在显示设备上构造图形。
图形是由人们通过计算机设计和构造的,而不是由照相机,扫描仪和其他设备输入的图像。
这里的图形可以是现实存在的图形,也可以是完全以虚拟方式构建的图形。
它以矢量图的形式呈现,强调了场景的几何表示并记录了图形的形状参数和属性参数。
例如,工程图的最基本图形单位是点,线,圆/弧等,其信息包括图元的几何信息和属性信息(显性属性,例如颜色,线型和线宽以及隐式属性例如层次结构)。
图像处理是分析和处理图像的过程。
图像处理研究图像添加,模式识别,场景分析等。
研究对象通常是二维图像。
图像以位图的形式显示,并记录每个点的灰度或颜色。
例如,照片,扫描的图片,逼真的和非逼真的图像以及计算机生成的形状等。
最基本的像素(象素)是点像素,它们的信息实际上是点及其属性信息(颜色,灰度),亮度等)。
计算机视觉包括更一般意义上的获取,处理,分析和理解图像或真实世界的高维数据的方法。
其目的是生成决策形式的数字或符号信息。
工作报告之计算机图形学实验报告计算机图形学实验报告【篇一:计算机图形学实验报告及代码】第1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。
二、教学要求1. 了解计算机图形学的概念和研究内容;2. 了解本门课程的发展概况。
三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。
五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。
八、教学内容1.1 计算机图形学的研究内容计算机图形学(computer graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。
计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。
具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2d):在平面坐标系中定义的图形(2).三维图形(3d):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。
(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。
目录实验一直线的DDA算法一、【实验目的】1.掌握DDA算法的基本原理。
2.掌握DDA直线扫描转换算法。
3.深入了解直线扫描转换的编程思想。
二、【实验内容】1.利用DDA的算法原理,编程实现对直线的扫描转换。
2.加强对DDA算法的理解和掌握。
三、【测试数据及其结果】四、【实验源代码】GLsizei winWidth=500;GLsizei winHeight=500;void Initial(void){glMatrixMode(GL_PROJECTION);}void DDALine(int x0,int y0,int x1,int y1){int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=x1-x0; dy=y1-y0;x=x0; y=y0;if(abs(dx)>abs(dy)) epsl=abs(dx);else epsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glPointSize(3);glBegin(GL_POINTS);glEnd();x+=xIncre;y+=yIncre;}}void Display(void){glClear(GL_COLOR_BUFFER_BIT);DDALine(100,100,200,180);glFlush();}void winReshapeFcn(GLint newWidth, GLint newHeight) {glMatrixMode(GL_PROJECTION);glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT);winWidth=newWidth;winHeight=newHeight;}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line");Initial();glutDisplayFunc(Display);glutReshapeFunc(winReshapeFcn);glutMainLoop();return 0;}实验二Bresenham绘制直线和圆一、【实验目的】1.掌握Bresenham算法扫描转换圆和直线的基本原理。
目录实验一、熟悉VC使用及如何绘图实验二、DDA、Bresenham两种方式画直线实验三、使用中点法画完整的圆实验四、区域填充实验五、图形变换实验六、裁剪算法实验七、用OpenGL生成真实感图形(选作)实验一:使用VC开发绘图程序的基本方法一、实验目的:编写一个具有一定功能的MFC类库应用程序(引入简单的视图/文档概念),掌握GDI画图的基本方法,并调用系统函数画直线。
二、基本概念:1、什么是视图用户角度:与其他Windows窗口一样的窗口程序员:从MFC的Cview类派生的类的一个对象2、单文档界面和多文档界面单文档:一次只能打开一个文档(NotePad)多文档:一次能打开多个文档(Word)3、设备上下文DC (Device Context)是一种数据结构,在Windows下表示物理设备的逻辑形式。
有多种DC:显示设备上下文Display DC:将显示信息输出到视频显示器。
打印设备上下文Printer DC:将显示信息输出到打印机。
内存设备上下文Memory DC:为特定的设备保存位图图像。
信息设备上下文Information DC:用于访问默认设备数据信息的设备上下文。
4、使用设备上下文DCMFC类库提供了不同类型的设备上下文的类,每一个类都封装了代表Windows设备上下文的句柄(HDC)和函数CDC类:是设备上下文的基类,其它的设备上下文类都是CDC的派生类。
CDC类非常庞大,包含170多个成员函数和数据成员。
利用它可以访问整个显示设备和其它输出设备CPaintDC类:是OnPaint()函数使用的设备上下文类,代表了窗口的绘图画面。
CClientDC类:是窗口客户区的设备上下文类,代表了客户区窗口的绘图画面。
CWindowDC类:类是整个窗口区域的设备上下文类,整个窗口区域即包括客户区又包括非客户区,即允许用户在显示器屏幕的任何地方绘图,包括窗口边框、标题区域。
CMetaFileDC类:用于创建一个Windows图元文件的设备上下文。
教育科学与技术学院 2016/2017学年第一学期 实 验 报 告
实验课程名称 计算机图形学
专 业 教育技术学 学 生 学 号 B******** 学 生 姓 名 朱志耀 指 导 教 师 熊健、闫静杰 指 导 单 位 通信与信息工程学院
日 期: 2016年 11月 24日 1、每项实验报告的内容 ==============================================================================
实验一:直线的生成算法实现 一、 实验目的: 理解直线生成的原理;
二、 实验内容: 1、了解直线的生成原理 2、掌握几种基本的直线生成算法:DDA画线法、中点画线法、Bresenham画线法。 3、仿照教材关于直线生成的Bresenham算法,编译程序。 4、调试、编译、运行程序。
三、 实验方法及编程: a) 实现方法介绍 本次实验是在Turbo C 2.0的平台上编译实现的;Bresenham算法的基本原理是:过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 b) 实现代码及分析 #include "stdio.h" #include "graphics.h" Bresenham_line(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy,i,e; float k; dx=x1-x0; dy=y1-y0; k=(dy*1.0)/dx; /*求斜率*/ e=2*dy-dx; x=x0; y=y0; for (x=x0; x<=x1; x++) { putpixel(x,y,RED);/*画红色的像素点*/ e=e+2*dy; if(e>=0) { y++; e=e-2*dx; } } } int main() { int x0,y0,x1,y1,c; int graphdriver=DETECT,graphmode=0; /*自动搜索显示器类型和显示模式*/ initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); /*初始化图形系统*/ setbkcolor(WHITE); /*设置背景为白色*/ setcolor(BLUE); /*设置直线为蓝色*/ Bresenham_line(100,100,500,500,3); /*画以(100,100)为起点,(500,500)为终点,3为像素点的直线*/ getch(); /*从控制台读取一个字符,但不显示在屏幕上*/ closegraph(); /*关闭图形系统*/ }
四、 实验结果及分析:
这幅图片是以Bresenham直线扫描算法绘制的以(100,100)为起点,(500,500)为终点的一条直线,背景被设置为了白色,以蓝色画出了这条直线。 实验二:自由曲线的生成算法实现 一、 实验目的: 理解曲线生成的原理
二、 实验内容: 1、了解自由曲线的生成原理。 2、掌握三次样条曲线和Bezier曲线的生成算法。 3、仿照教材关于自由曲线生成的Bezier算法,编译程序。 4、调试、编译、运行程序。
三、 实验方法及编程: a) 实现方法介绍 本次实验是在Turbo C 2.0的平台上编译实现的;用光滑参数曲线段逼近折线多边形,只需要根据给出的数据点就可以构造出曲线,曲线次数严格依赖于确定该段曲线的数据点个数,曲线形状依赖于多边形的形状,多边形的第一个顶点和最后一个顶点在曲线上。 b) 实现代码及分析 #include #include #include #include #include #define N 1000 int n;//控制点的个数 struct point //控制点的坐标 { double x; double y; }point[N]; void init() //输入控制点的坐标 { int i; printf("please input the number of the points: "); scanf("%d",&n); printf("please input the location of the points\n"); for(i=0;iscanf("%lf %lf",&point[i].x,&point[i].y); } void sol1() //绘制控制多边形的轮廓 { int i; setcolor(RED); for(i=0;iline((int)point[i].x,(int)point[i].y,(int)point[i+1].x,(int)point[i+1].y); } double sol2(int nn,int k) //计算多项式的系数C(nn,k) { int i; double sum=1; for(i=1;i<=nn;i++) sum*=i; for(i=1;i<=k;i++) sum/=i; for(i=1;i<=nn-k;i++) sum/=i; return sum; } void sol3(double t) //计算Bezier曲线上点的坐标 { double x=0,y=0,Ber; int k; for(k=0;k{ Ber=sol2(n-1,k)*pow(t,k)*pow(1-t,n-1-k); x+=point[k].x*Ber; y+=point[k].y*Ber; } putpixel((int)x,(int)y,GREEN); } void sol4() //根据控制点,求曲线上的m个点 { int m=500,i; for(i=0;i<=m;i++) sol3((double)i/(double)m); } int main() { int graphdriver=DETECT,graphmode=0; /*自动搜索显示器类型和显示模式*/ initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); /*初始化图形系统*/ init(); sol1(); sol4(); getch(); closegraph(); return 0; } 四、 实验结果及分析: 本次测试结果使用3个点,随机取了点(100,100)、(200,200)、(300,100),绘制相应的Bezier曲线,结果如下。 实验三:二维图形的几何变换 一、 实验目的: 理解二维图形的几何变换的基本原理
二、 实验内容: 根据二维图形几何变换的基本原理及其变换矩阵:(二选一) (1) 编写实现二维图形平移、旋转变换的C语言程序; (2) 编写实现二维图形错切、比例变换的C语言程序; 要求设置变换的参数变量,以便观察不同取值情况下的变换效果。
三、 实验方法及编程: a) 实现方法介绍 本次实验是在turbo c上实现的编程,平移变换时将平移距离tx和ty加到原始坐标(x,y)上获得一个新的坐标位置,可以实现一个二维位置的平移,旋转变换时,通过在xy平面上沿圆路径将对象重新定位来实现。 b) 实现代码及分析 #include"stdio.h" #include"string.h" #include"graphics.h" #include"math.h" #include"conio.h" #define PI 3.1415926
void sanjiaoxing()//画一个基础的三角形,用于进行平移和变换 { int graphdriver=DETECT,graphmode=0; initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); line(15,20,10,30); line(10,30,20,30); line(20,30,15,20); }
void pingyi()//平移函数的实现 { int a,b;//x轴和y轴的平移量a,b int graphdriver=DETECT,graphmode=0; initgraph(&graphdriver,&graphmode,"c:\\TC20\\BGI"); printf("please input a and b!"); scanf("%d %d",&a,&b);//进行a,b的输入 sanjiaoxing();//画三角形用于进行比较 line(15+a,20+b,10+a,30+b);//画平移后的三角形 line(10+a,30+b,20+a,30+b); line(20+a,30+b,15+a,20+b); }