当前位置:文档之家› 计算机图形学第五次实验报告

计算机图形学第五次实验报告

计算机图形学第五次实验报告
计算机图形学第五次实验报告

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

实验十一真实感图形

一、实验教学目标与基本要求

初步实现真实感图形,并实践图形的造型与变换等。

二、理论基础

运用几何造型,几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1. 用给定地形高程数据绘制出地形图;

2. 绘制一(套)房间,参数自定。

三.算法设计与分析

真实感图形绘制过程中,由于投影变换失去了深度信息,往往导致图形的二义性。要消除这类二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称之为消除隐藏线和隐藏面,或简称为消隐,经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题,目前已提出多种算法,基本上可以分为两大类:即物体空间方法和图象空间方法。物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现

1.物体空间的消隐算法

物体空间法是在三维坐标系中,通过分析物体模型间的几何关系,如物体的几何位置、与观察点的相对位置等,来进行隐藏面判断的消隐算法。世界坐标系是描述物体的原始坐标系,物体的世界坐标描述了物体的基本形状。为了更好地观察和描述物体,经常需要对其世界坐标进行平移和旋转,而得到物体的观察坐

标。物体的观察坐标能得到描述物体的更好视角,所以物体空间法通常都是在观察坐标系中进行的。观察坐标系的原点一般即是观察点。物体空间法消隐包括两个基本步骤,即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体,而且可以大大简化和降低消隐算法的运算。因此,利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序

法、光线投射法和区域子分法。其中前三种算法最常用,它们的基础都是背面消隐原理。所谓背面消隐原理,即是相对观察点来说朝向后面的物体表面是不可见的,应被隐藏。下面只对平面公式法作详细介绍,其他方法可参看有关文献。

根据解析几何原理,通过标准的平面方程可以判断给定点是在平面的正面还是背面。平面公式法利用此原理来判断观察点位于物体表面的哪一面,如位于背面一侧,则表面不可见,应被消隐;反之则可见。对物体的任意表面,可将其划分为若干个平面,在根据平面上任意三点的坐标可以求得其平面方程。标准的平面方程为:

Ax+By+Cz+D=0;

其中A、B、C、D 为决定平面的常数。当把一个平面想象成一个凸型多面体时,设观察点坐标为(x,y,z),如果:

①Ax+By+Cz+D=0,则观察点(x,y,z)是该平面表面上的一个点;

②Ax+By+Cz+D>0,则观察点(x,y,z)在凸型多面体内部(称该表面是不可见的或隐藏的);

③Ax+By+Cz+D<0,则观察点(x,y,z)在凸型多面体外表面(称该表面是可见的),应被画出。

通过对物体进行适当旋转和平移后,可将物体变换到以观察点为原点的观察坐标系中,如果在观察坐标系中求得了平面的方程Ax+By+Cz+D=0,将观察点坐标代入上面的判断准则,则可得出如下的简单判据:

①D>0,则平面不可见,应被隐藏;

②D<0,则平面是可见面,应被画出。

2 图像空间的消隐算法

图象空间法基于物体三维模型的二维显示图形来确定物体或表面上的每一点与观察点的远近关系,从而判断哪些表面遮挡了其它表面。为了获得三维物体的二维显示图形,在对物体进行旋转和平移变化后,还需对物体进行透视投影变换。图像空间法包括Z缓冲区法、扫面线法、光线投射法和极值检测法等几种。以下是这几种算法的比较。

①Z缓冲区消隐算法简单、可靠,而且消隐和表现效果很好。但需要的内存容量大,运算复杂,费时;

②扫描线法克服了Z缓冲区法需要分配与屏幕上象素点的个数相同单元的巨大内存这一缺点;

③光线投射法的思想是:考察由视点出发穿过观察屏幕的一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体。在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色;如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。

④极值检测法需与其它消隐算法结合适用,主要用来提高消隐速度。极值检测法通过计算物体表面的显示坐标的极大和极小值来判断这两个表面是否存在重叠。

2)光照模型

计算机图形学中真实感成像包括两部分内容:物体的精确图形表示和场景中光照效果的适当物理描述。光照效果包括光的反射、透明性、表面纹理和阴影。

在下面的讨论中,假定光源为点光源。从某点光源照射到物体表面上一点,再反射出来的光,可以分为三部分:环境光、漫反射光和镜面反射光。为可见物体的光照效果建立模型是一个非常复杂的过程,计算机图形学中光照模型可以由描述物体表面明暗度的物理公式推导出来。为了减少明暗度计算量,通常采用简化的光照计算经验模型。下面介绍一些基本的光照模型。

1 环境光

一个物体表面即使不直接暴露在光源下,只要其周围的物体被照亮,它也可能看得见,称为环境光。环境光没有空间或方向上的特征,在所有方向上和所有

物体表面上投射的环境光数量都恒定不变。

e a a

e a a I I K I I K =------环境光反射强度

环境光的强度

物体表面对环境光的反射系数

由于环境光只能为每个面产生一个平淡的明暗效果,因而在绘制场景时很少仅考虑环境光作用。

2 漫反射

设物体表面在P 点的法矢为N ; 从P 点指向光源的矢量为L ;N 与L 的夹角为θ;若N 与L 的夹角小于0或大

于90度,则光线被物体自身遮挡而照射不到P 点。由

Lambert 余弦定理可得点P 处漫反射光的强度为: cos ,[0,]2d p d p d I I K I K πθθθ=∈---入射光的强度

漫反射系数光线的入射角

如有多个点光源:,1cos n d p i d i i I I K θ==

3 镜面反射

镜面反射情况由Phong 模型给出:

s cos

I n s p s p I I K I V R n n αα=----镜面反射光在观察方向上的光强

点光源的强度与之间的夹角

与物体表面光滑度有关的

一个常数,表面越光滑,越大。

cos n s p s

I I K α= 考虑到受距离影响的衰减,上式重写为:

2

00cos /(d d )n s p s I I K d d α=+--为点光源到物体表面参考点的距离

为一参考值

4 简单光照模型

从视点观察到物体上任一点P 处的光强度I 应为环境光反射光强度Ie 、漫反射光强度Id 以及镜面反射光的光强度Is 的总和。

2

02

0cos cos /()()()/()e d s

n a a p d p s n a a p d p s I I I I I K I K I K d d I K I K L N I K R V d d θα=++=+++=+?+?+

在RGB 颜色模型中,把入射光强I 设为三个分量,分别代表RGB 三基色的光强,通过这些分量的值来调整光源的颜色。同样的,Ka 、Ks 、Kd 也有三个分量。于是,RGB 颜色模型形式: ()()()()()()n

r ar ar pr dr pr sr n g ag ag pg dg pg sg n

b

ab ab pb db pb sb I I K I K L N I K R V I I K I K L N I K R V I I K I K L N I K R V ?=+?+??=+?+???=+?+??

3)绘制真实感图形

下面我们采OpenGL 实现地球绕太阳的公转和月球绕地球的公转并自身带有一定速率的自转。

在DrawScene 函数中先画太阳椭圆线(DrawSunEllipse),在画太阳(DrawSun()),其次地球(DrawEarth()),在画地球椭圆线(DrawEarthEllipse()),最后画月亮(DrawMoon())。下面分别介绍各个图形是怎样表现出来的。

1 DrawSunEllipse():

画椭圆线是根据方程x*x/a*a+y*y/b*b=1;转换为三角表达形式:x=a*cos(angle),y=b*sin(angle);使angle 角度在[0,2*PI]中变化是绘点便可得到一个以点组成的椭

圆。

2 DrawSun():

画太阳比较简单,直接绑定纹理(glBindTexture()),,在绘球(gluSphere())即可。

3 DrawEarth():

想要在绘出地球的运行轨迹,即地球不论怎样转都在太阳的椭圆上,即须将进行模型平移(glTranslatef()),将当前的坐标系移到太阳椭圆的位置上来。考虑到绘制太阳和其椭圆时是在当前坐标系上进行绘制的,现在平移至太阳椭圆上,即只需在x,z轴上分别平移x=a*cos(angle),z=b*sin(angle),即glTranslatef(x,0,z);在到这个坐标系上来进行绘制;但此时地球并未随地球而转动,想实现这个效果可将模型平移中的x,z值变化,这里采用程序的多线程性,这里在Revolution()中while(TRUE)循环所有的angle角度值。注意因为系统处理速度较快,若不在x,z中设置相应的暂停函数,则很难看出效果,这里用Sleep(20)来暂停。

4 DrawEarthEllipse():

绘制地球椭圆时,注意此时的坐标系已在地球的位置上了,除非调用glLoadIdentity()重置坐标系函数。同绘制太阳椭圆原理一样,采用椭圆方程,只不过这里的椭圆大小是太阳椭圆的7倍,即x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle)

DrawMoon():绘制月球,同样月球是在地球的轨道上运行,同理,亦要平移模型坐标系,使x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle),同地球公转一样设置在多线程函数中Revolution(),调用glTransferf(x,0,z)定位到地球轨迹上,并实现月亮的公转。

5 视角的变换和视点的平移

此程序可通过上、下键来进行视点位置的前移或后移;通过左右实现视线方

向的左右变换。通过PgUp键实现视线向上翻转,通过PgDn实现实现向下翻转:在说其平移和变换时,先介绍glLookAt()函数,前三个函数为视点方向,中间三个为参考点(=视点方向+实现方向),后后三个参数为成像正立,一般设置为0,1,0。初始化视x=0.0f,y=0.0f,z=5.0f;在定义视线位置lx=0.0f,ly=0.0f,lz=-1.0f;glLookAt(x,y,z,x+lx,y+ly,z+lz,0,1,0);

视点位置平移:在xz平面内,仅需改变x,z值即可;前移:x+=lx*(一定速值);z+=lz*(一定速值);同理,后移x-=lx*(一定速值);z-=lz*(一定速值);

视线方向改变:当视线向右变换时,此时视角(MoveAngel按一定速率自增)改变,xz平面内lx,lz值改变,即lx=sin(MoveAngle),lz=-cos(MoveAngle);同理视线左边换时,MoveAngle按一定速率自减,使lx=sin (MoveAngle),lz=-cos(MoveAngle);

PgUp,PgDn的图像翻转实现:同理类似与视线的变换,只不过变换的平面不一样,PgUp和PgDn的上下翻转是在yz平面内实现,且在视线上下变换的同时,y点的视点位置亦要随之改变,这也就是翻转与视线变换的不同之所在了。

四、程序调试及结果的分析

本程序运行环境为VC下的opengl环境。

实验效果:

按“上、下”键可实现视点的前移和后退。

按“左、右”键可实现视线的左右变换。

按“PgUp、PgDn”键可实现实现的图像的翻转。

按“L”键可实现光源的启用或关闭。

由于实验代码比较长,本实验暂不将代码附在实验报告中。

运行结果展示:

关闭灯光后:

五.实验心得及建议

1.通过这次实验,我对OPENGL有了进一步的了解,也增添了对三维绘图的兴趣。

2.由于之前对OPENGL的了解比较少,所以程序中很多部分抄袭了网上的一些教程,以后有时间再自学OPENGL做进一步改进。

3.对于真实感图形需要有比较好的空间思维能力,去想像出如何将一个三维图形很好的投影到二维平面上。

4.对于真实感图形,我们除了要学会消隐的基本概念和思想方法外,还需要熟练运用颜色、纹理、光照等技巧。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学上机实验报告

计算机图形学实验报告 姓名: 学号: 班级:

目录 实验一OpenGL程序结构练习 (3) 实验二基本图形生成 (6) 实验三交互式控制 (9) 实验四图形基本变换 (12) 实验五三维图形生成及显示 (15) 实验六三维图形生成及显示 (19)

实验一OpenGL程序结构练习 【实验目的】 1.熟悉C语言环境下OpenGL的使用方法; 2.了解OpenGL程序的基本结构。 【实验原理】 绝大多数OpenGL程序具有类似的结构,包含下述函数 main(): 定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句) init(): 设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include // glut.h includes gl.h and glu.h void display() { ……} void init() { ……} int main( intargc, char **argv) { ……}

【实验内容】 1.了解程序中各个结构的功能; 2.用OpenGL生成三角形。 【实验步骤及结果】 1.导入OpenGL的glut3 2.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。 2.打开VC 6.0,新建工程,并命名为text1,如图1. 图 1 3.在工程text1下新建源文件,并命名为text1.cpp。 4.编写代码并编译链接,如图2所示。

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

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; 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 DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); 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); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { 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++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学课程参考文献

《计算机图形学》课程参考文献 [1 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.doczj.com/doc/5d13162889.html,/. [3] William E. Lorensen, Harvey E. Cline. Marching Cubes: A High Resolution 3D Surface Construction Algrorithm[J].Computer Graphics, 1987, 21(4). [4] Jan Horn. Metaballs程序[CP]. http://www.sulaco.co.za. [5] 唐泽圣,等.三维数据场可视化[M].北京:清华大学出版社,1999.177-179. [6] 白燕斌,史惠康,等.OpenGL三维图形库编程指南[M].北京:机械工业出版社,1998. [7] 费广正,芦丽丹,陈立新.可视化OpenGL程序设计[M].北京:清华大学出版社,2001. [8] 田捷,包尚联,周明全.医学影像处理与分析[M].北京:电子工业出版社,2003. [9] 三维表面模型的重构、化简、压缩及其在计算机骨科手术模拟中的应用[R]. https://www.doczj.com/doc/5d13162889.html,/~yike/uthesis.pdf ; [10] 首套中国数字化可视人体二维图像[DB]. http://www.chinesevisiblehuman. com/ pic/pictype.asp [11] 季雪岗,王晓辉,张宏林,等.Delphi编程疑难详解[M].北京:人民邮电出版社,2000. [12] 郑启华.PASCAL程序设计(第二版)[M].北京:清华大学出版社,1996. [13] 涂晓斌,谢平,陈海雷,蒋先刚.实用微机工程绘图实验教程[M].西南交通大学出版社,2004,4. [14] David F.Rogers.计算机图形学算法基础[M].北京:电子工业出版社,2002. [15] 李信真,车刚明,欧阳洁,封建湖.计算方法[M].西安:西北工业大学出版社,2000. [16] Paul Bourke Polygonising a scalar field [CP]. http://astronomy. https://www.doczj.com/doc/5d13162889.html,.au/ ~pbourke/ modelling/polygonise/ [17] 刘骏.Delphi数字图像处理及高级应用[M].北京:科学出版社,2003. [18] 李弼程,彭天强,彭波,等.智能图像处理技术[M].北京:电子工业出版社,2004. [19] Kenneth R.Castleman著,朱志刚,石定机,等译.数字图像处理[M].北京:电子工业出版社,2002. [20] Milan Sonka, Vaclav Hlavac, Roger Boyle.Image Processing, Analysis, and Machine Vision [M].北京:人民邮电出版社,2003. [21] 阮秋奇.数字图像处理学[M]. 北京:电子工业出版社, 2001. [22] 刘宏昆,等.Delphi应用技巧与常见问题[M]. 北京:机械工业出版社, 2003. [23] 张增强,李鲲程,等.专家门诊—Delphi开发答疑300问[M].北京:人民邮电出版社,2003.6.

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

一种基于计算几何方法的最小包容圆求解算法.kdh

2007年 工 程 图 学 学 报2007 第3期 JOURNAL OF ENGINEERING GRAPHICS No.3一种基于计算几何方法的最小包容圆求解算法 张 勇, 陈 强 (清华大学机械工程系先进成形制造重点实验室,北京 100084) 摘要:为实现点集最小包容圆(最小外接圆)的求解,将计算几何中的α-壳的概 念应用到最小包容圆的计算过程,提出了一种精确有效的最小包容圆求解算法。根据α-壳定 义及最小包容圆性质,证明当1/α等于最小包容圆半径时点集的α-壳顶点共圆,1/α小于最小 包容圆半径时α-壳不存在,1/α大于最小包容圆半径时随着1/α减小α-壳顶点数逐渐减小的规 律。将α-壳顶点数目作为搜索最小包容圆半径的依据,实现了最小包容圆半径的搜索和最小包容圆的求解。 关键词:计算机应用;优化算法;计算几何;最小包容圆;α-壳 中图分类号:TP 391 文献标识码:A 文章编号:1003-0158(2007)03-0097-05 Algorithm for Minimum Circumscribed Circle Detection Based on Computational Geometry Technique ZHANG Yong, CHEN Qiang ( Key Laboratory for Advanced Manufacturing by Materials Processing Technology, Department of Mechanical Engineering, Tsinghua University, Beijing 100084, China ) Abstract: α-hulls are applied to calculate the minimum circumscribed circle (MCC) of point set and an accurate and effective method for MCC detection is established through finding the least squares circle of the point set and iteratively approaching the MCC with recursive subdivision. Several theorems concerning the properties of α-hulls are presented. If 1/α is equal to the radius of points’ MCC, all vertices of the α-hull will be on the same circle. When 1/α is larger than the MCC’s radius, the number of vertices of α-hulls will decrease with decreasing of 1/α, and the number of vertices’ number will reach zero when 1/α is smaller than MCC’s radius. From the above rules, an algorithm for detecting MCC is developed, and experimental results show this algorithm is reliable. Key words: computer application; optimized algorithm; computational geometry; minimum circumscribed circle; α-hull 收稿日期:2005-12-20 基金项目:国家自然科学基金资助项目(50275083);高校博士点基金资助项目(20020003053)

计算机图形学上机实验4_实现Bezier曲线和Bezier曲面的绘制

昆明理工大学理学院 信息与计算科学专业操作性实验报告 年级: 10级姓名:刘陈学号: 201011101128 指导教师: 胡杰 实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验内容: 1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时 3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机 (2)软件:windows OS,VC++6.0或以上版本。 试验内容及步骤: (1)在VC++环境下创建MFC应用程序工程(单文档) (2)编辑菜单资源 (3)添加菜单命令消息处理函数 (4)添加成员函数 (5)编写函数内容 试验要求: (1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。 (2)实现对Bezier曲线、Bezier曲面、及另一个曲面。 (3)试验中调试、完善所编程序,能正确运行出设计要求结果。 (4)书写试验报告上交。 4.程序结构(程序中的函数调用关系图)

5.算法描述、流程图或操作步骤: 在lab4iew.cpp文件中添加如下头文件及变量 int flag_2=0; int n_change; #define M 30 #define PI 3.14159 //圆周率 #include "math.h" //数学头文件 在lab4iew.h文件中的public内添加变量: int move; int graflag; void Tiso(float p0[3],float x0, float y0, float p[3]); void OnBezierface(); 在lab4iew.h文件中的protected内添加变量: int n;//控制点数 const int N;//控制点数的上限 CPoint* a;//控制点存放的数组 double result[4][2]; 在lab4iew.cpp文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码: int i,j; for(i=0;iFillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255)); } pDC->MoveTo(a[0]);

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

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

一、实验目的 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(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

研究生计算机图形学课程室内场景OpenGL--实验报告

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.doczj.com/doc/5d13162889.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREA TE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

清华大学计算机研究生课程表

清华大学计算机研究生课程表 清华大学计算机研究生课程表 计算机系研究生课程介绍 课程名称:组合数学 课程编号:60240013 课学时:48 开课学期:秋任课教师:黄连生 【主要容】

主要介绍组合数学的基本容,包括基本记数方法、母函数与递推关系、容斥 原理与鸽巢原理、Burnside引理与Polya定理、区组设计与编码的初步概念、线性规划问题的单纯形算法。 课程名称:数据结构 课程编号:60240023 课学时:48 开课学期:春秋 任课教师:严蔚敏 【主要容】 线性表、树、图等各种基本类型数据结构的结构特性、存储表示及基本操作实现的算法;查找表的各种表示方法;各种排序算法的设计与分析;文件组织方法的简单介绍。 课程名称:软件工程技术和设计

课程编号:60240033 课学时:48 开课学期:春任课教师:周之英 【主要容】 1、软件开发技术发展史; 2、软件工程技术方法的基本原则; 3、软件过程改进; 4、需求工程; 5、软件体系结构; 6、面向对象设计方法; 7、Design Pattern; 8、分布式系统对象模型:CORBA及DCOM/COM(OLE)等; 9、实例分析(实时系统的设计)等。 课程名称:专家系统 课程编号:60240043 课学时:48 开课学期:春任课教师:艾海舟 【主要容】 讲解专家系统的基本原理、构造方法、应用实例、开发工具和发展趋势,介绍人

工智能原理和知识工程的相关容,包括产生式系统、搜索技术、知识表示、知识获取 、推理机、不确定推理方法等容。 课程名称:人工智能 课程编号:60240052 课学时:32 开课学期:秋任课教师:群秀 【主要容】 人工智能的定义、发展历史及研究的课题;人工智能的典型系统结构--产生式系统; 搜索技术(盲目搜索、启发式搜索、博奕树搜索);谓词演算(知识表示);人工智能语言程序设计。 课程名称:微型计算机系统接口技术 课程编号:60240063 课学时:48 开课学期:春

计算机图形学实验报告

计算机图形学(computer graphics)的基本含义是使用计算机通过算法和程序在显示设备上构造图形。图形是人们通过计算机设计和构造出来的,不是通过摄像机、扫描仪等设备输入的图像。这里的图形可以是现实中存在的图形,也可以是完全虚拟构造的图形。以矢量图的形式呈现,更强调场景的几何表示,记录图形的形状参数与属性参数。例如,工程图纸(drawing),其最基本的图形单元是点、线、圆/弧等,其信息包含图元的几何信息与属性信息(颜色、线型、线宽等显式属性和层次等隐式属性)。 图像处理(image processing)则是研究图像的分析处理过程,图像处理研究的是图像增加、模式识别、景物分析等,研究对象一般为二维图像。图像以点阵图形式呈现,并记录每个点的灰度或色彩。例如,照片、扫描图片和由计算机产生的真实感和非真实感图·形等,最基本的图像单元(pels,picture elements)是点—像素(pixel),其信息实际上是点与它的属性信息(颜色、灰度、亮度等)。 计算机视觉(computer vision)包括获取、处理、分析和理解图像或者更一般意义的真实世界的高维数据方法,它的目的是产生决策形式的数字或者符号信息。

计算机图形学和计算机视觉是同一过程的两个方向。计算机图形学将抽象的语义信息转化成图形,计算机视觉则从图形中提取抽象的语义信息,图像处理研究的则是一个图像或一组图像之间的相互转化和关系,与语义信息无关。下表从输入和输出的角度对三者的区别进行辨析: 表2 图像处理&计算机视觉&计算机图形学对比 计算机图形学,输入的是对虚拟场景的描述,通常为多边形数组,而每个多边形由三个顶点组成,每个顶点包括三维坐标、贴图坐标、RGB 颜色等。输出的是图像,即二维像素数组。 计算机视觉,输入的是图像或图像序列,通常来自相机、摄像头或视频文件。输出的是对于图像序列对应的真实世界的理解,比如检测人脸、识别车牌。图像处理,输入的是图像,输出的也是图像。

计算机图形学上机实验2-交互实现多边形绘画并填充

计算机图形学上机实验2-交互实现多边形绘画并填充

昆明理工大学理学院 信息与计算科学专业操作性实验报告 年级: 10级姓名:刘陈学号: 201011101128 指导教师: 胡杰 实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验内容: 1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时 3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机 (2)软件:windows OS,VC++6.0或以上版本。 试验内容及步骤: (1)在VC++环境下创建MFC应用程序工程(单文档) (2)编辑菜单资源 (3)添加菜单命令消息处理函数 (4)添加成员函数 (5)编写函数内容 试验要求 (1)试验前自习课本第2章内容,编写相关程序。 建立一VC++单文档工程,在菜单项中建立图形绘图菜单(包 括绘制直线、折线、矩形、(椭)圆、多边形)和区域填充菜单项。 (2)实现对(椭)圆和多边形的填充。 (3)试验中调试、完善所编程序,能正确运行出设计要求结果。 (4)书写试验报告上交。 第2页

4.程序结构(程序中的函数调用关系图) 5.算法描述、流程图或操作步骤: 在lab2View.h文件中的public内添加变量 CPoint v[30]; int index; bool first; bool move; 在lab2View.cpp文件中的函数CLab2View::CLab2View()下添加如下代码: index = 1; //定义工作区 第3页

相关主题
文本预览
相关文档 最新文档