搜档网
当前位置:搜档网 › 计算机图形学实验报告(一).doc

计算机图形学实验报告(一).doc

实验一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),及颜色color

float 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);

else

length=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

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(int

j=0;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)/(polypoi

nt[(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(float

j=p->x;j<=p->next->x;j++)

{

SetPixel(tmpDC,static_cast(j),i,RG B(255,200,0));//此处我改变了颜色,八

边形的为黄色

//

SetPixel(tmpDC,static_cast(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的基本库。

实验中我掌握了DDA算法的基本思路、多边形的填充算法的基本思路和填充颜色的一些操作,以争取达到美化的功效。本次试验老师已经把这些图形画法的算法和实现都给了我们,我们只要去修改些算法的参数就可以了。但我还是去尝试着自己去建立了些工程,但最后还是发现挺麻烦的,所以放弃了。

通过本次实验,我深深地体会到了图形学的深奥和美丽之处,我发现自己已经喜欢上图形学这门课程了。精品文档

精品文档

计算机图形学实验报告

计算机图形学 实验报告 学号: 姓名: 班级:计算机 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.实习三维图形的坐标系之间的变换; 2.三维图形几何变换; 3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等); 二、理论基础 在齐次坐标理论下,二维图形几何变换矩阵可用下式表示: ? ? ? ? ? ? ? = = = i f c h e b g d a T n k x x k k 2,1,0 , ) ( ? 平移变换:[x* y* 1] =[x y 1] * 00 00 001 t s ?? ? ? ? ??=[t*x s*y 1] 比例变换:[x* y* 1]=[x y 1] * 100 010 1 m n ?? ? ? ? ??=[m+x n+y 1] 旋转变换:在平面上的二维图形饶原点逆时针旋转?角,变换矩阵为 [x* y* 1]=[x y 1] * cos sin0 sin cos0 001 θθ θθ ?? ? - ? ? ??= [x*cos?-y*sin?] 复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。 三维变换类似于二维,在画图时,把三维坐标转换为二维即可。 三、算法设计与分析 二维变换: #define dx 50 #define dy 100 void 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];

南昌大学- -计算机图形学实验报告

南昌大学实验报告 计算机图形学实验 学生姓名: 学号: 6100 专业班级:计科112班 教学老师:徐老师

目录 一、实验一直线和圆 (1) 二、实验二填充算法 (5) 三、实验三裁剪算法 (7) 四、实验四曲线的绘制(Bezier) (11) 五、实验五曲线的绘制(B样条) (14)

南昌大学实验报告一学生姓名:学号:6100 专业班级:计科112 班 实验类型:□验证■综合□设计□创新实验日期:实验成绩:一.实验名称 直线和圆 二.实验目的 1、掌握中点画圆算法 2、熟悉曲线的整数加减来计算沿圆周的像素位置 三.实验内容 1、使用中点画圆算法,熟悉算法的内容和原理。 2、通过改变参数值设定背景色和圆的大小 四.实验结果 如图2-1.画直线算法

如图2-2.中点画圆算法 五.程序源码: //Line.cpp #include void init(void) { glClearColor(1.0,1.0,1.0,0.0) ; glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150. 0); } void lineSegment(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); glBegin(GL_LINES); glVertex2i(180,15); glVertex2i(10,145); glEnd(); glFlush(); } void main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SING LE|GLUT_RGB); glutInitWindowPosition(50,100 ); glutInitWindowSize(400,300); glutCreateWindow("Line"); init(); glutDisplayFunc(lineSegment); glutMainLoop(); } `#include void init(void) { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.

计算机图形学实验报告

计算机图形学 实验报告 实验一:二维线画图元的生成 实验目的:掌握直线段的生成算法,并用C/WIN-TC/VC++实现算法,包括中点法生成直线,微分数值法生成直线段等。 实验内容:用不同的方法生成斜率不同的直线段,比较各种方法的效果。 Bresenham 算法的思想 Bresenham 画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进行直线的扫描的转换的。通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的像素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的所有对象。 1.1方法一:直线的中点算法 算法的主要思想: 讨论斜率k ∈[1,+∞)上的直线段的中点算法。 对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。直线段的方程为: y m x B =+ ?y y x B x y y x x B x ?= +??=?+?? (,)0F x y xy yx xB ?=?-?-?= 现在假定已求得像素(,,i r i x y ),则如图得

,,11(,]22 i i r i r x x x ∈- + 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则 1,,13(,]22i i r i r x x x +∈-+ 在直线1i y y =+上,区间,,13 (,]22i r i r x x -+内存在两个像素NE 和E 。根据取整原则,当 11(,)i i x y ++在中点M 11 (,)2 i i x y ++右方时,取像素NE ,否则取像素E ,即 ,11,,1()()01()()0 i r i i r i r i x E F M x x x NE F M x +++? ?≤=? +?>?i i 点当(,y +1)在左方时点当(,y +1)在右方时 若取2()i d F M =,则上式变为 ,1,,()01(0 i r i i r i r i x E d x x NE d +? ≤=? +>?点当点)当 计算i d 的递推公式如下: ,1 1,12[(2)()]012 2(,2)0 122[(2)(1)] 2 i i r i i i i i i i r x y y x xB d d F x y d x y y x xB ++? ?+-?+-??≤?=++=? >??+-?++-??? =202() i i i i d x d d x y d +?≤?? +?-?>? 算法的初始条件为: 00,00,0(,)(0,0)1 2(,1)22 r r x y x y d F x y x y =? ? ?=++=?-??? 相应的程序示例: 建立成员函数: void MidPointLine4(CDC*pDC,int x0,int y0,int x1,int y1,int color) { /*假定x01*/ int dx,dy,incrE,incrNE,d,x,y; dx=x1-x0; dy=y1-y0; d=2*dx-dy; incrE=2*dx; incrNE=2*(dx-dy); x=x0;y=y0; pDC->SetPixel(x,y,color); while (x

计算机图形学实验报告及代码

计算机图形学实验报告及代码 第 1 章概述 一、教学目标 通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。 二、教学要求 1.了解计算机图形学的概念和研究内容; 2.了解本门课程的发展概况。 三、教学内容提要 1. 计算机图形学的研究内容 2. 计算机图形学发展概况 3. 计算机图形学特点和应用 4. 计算机图形学当前研究的课题 5. 计算机图形生成和输出的流水线 四、教学重点、难点及解决方法 本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。 五、课时安排 2学时 六、教学设备 多媒体 七、检测教学目标实现程度的具体措施和要求 通过课堂提问的方式来检测学生对基本概念的掌握程度。 八、教学内容 1.1 计算机图形学的研究内容 计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。 计算机图形表现形式 (1).线条式(线框架图)

用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。 (2).真实感面模型图形 跑车靓照 计算机图形分类(空间) (1).二维图形(2D):在平面坐标系中定义的图形 (2).三维图形(3D):在三维坐标系中定义的图形 计算机图形产生方法 (1).矢量法(短折线法) 任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。 (2).描点法(像素点串接法) 每一曲线都是由一定大小的像素点组成 计算机绘图方式: (1)交互式绘图 允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。如AUTOCAD等 (2)被动式绘图 图形在生成过程中,操作者无法对图形进行操作和控制。如C语言绘图 图形的操作与处理方法(Picture Manipulation) 如图形的开窗、裁剪、平移、旋转、放大、缩小、投影等各种几何变换操作的方法及其 软件或硬件实现技术。 图形信息的存储,检索与交换技术:如图形信息的各种表示方法、组织形式、存取技术、图形数据库的管理、图形信息通信等。 人机交互及用户接口技术:如新型定位设备、选择设备的研究;

计算机图形学实验报告-实验1直线段扫描转换

计算机图形学实验报告 班级计算机工硕班 学号 2011220456 姓名王泽晶

实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其程序设计方法。 实验内容 1. 绘制20*20的网格线,格子X 和Y 方向间隔均为20像素,网格起始坐标在(20,20)。我 们使用此网格模拟像素矩阵(019,019x y ≤≤≤≤),格子交叉点是像素中心。 2. 输入直线段两端点,可使用以下两种方法之一: a) 对话框输入 b) 鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。注意:直线段两端点要自动 取整到模拟的像素中心位置 3. 进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。计算完 成后,将扫描转换结果,在模拟的像素矩阵中,使用圆形显示出来。 方法一:直线的中点算法 算法的主要思想: 讨论斜率k ∈[1,+∞)上的直线段的中点算法。 对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。直线段的方程为: y m x B =+ ?y y x B x y y x x B x ?= +??=?+?? (,)0F x y xy yx xB ?=?-?-?= 现在假定已求得像素(,,i r i x y ),则如图得 ,,11 (,]22 i i r i r x x x ∈- + 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则 1,,13(,]22i i r i r x x x +∈- + 在直线1i y y =+上,区间,,13 (,]22 i r i r x x -+内存在两个像素NE 和E 。根据取整原则,当

《计算机图形学》课内实验报告(实验一)

目录 一、实验题目 (1) 二、实验目的 (1) 三、实验内容 (1) 四、实验结果 (1) 五、实验体会或遇到问题 (2)

一、实验题目 VC++结合OpenGL的程序设计方法 二、实验目的 1.认识VC++6.0下MFC的基本实现方法; 2.掌握OpenGL的安装,使用与基本操作。 三、实验内容 1. 安装并使用VC++6.0 安装VC++6.0后并启动VC++6.0,然后新建工程,并重命名,生成可执行文件或MFC完成就可编写代码。 2. OpenGL的安装 OpenGL开放图形库,是一个三维计算机图形和模型库,是美国SGI公司为图形工作站开发的一种功能强大的三维图形开发包,在高级图形动画设计中表现十分突出,其安装要以VC++6.0或Java等编程语言为基础,在VC库文件中添加OpenGL专用库gl.lib,glut.lib,glaux.lib等,在头文件中添加gl.h, glut.h, glaux.h,并在系统目录(system32目录)下添加glut.dll,到glut32.dll, opengl32.dll等。这样外部环境已完成,在编写程序时再连结相应的库就可以正常使用VC++6.0结合OpenGL编写图形程序。 3.通过演示程序了解OpenGL的强大功能,同时了解编程方法。 四、实验结果 1、建立一个工程(工程名称:first program)并及一个文件(文件名:hello world.cpp)。

编写一个输出“hello world”的程序,编译运行。 生成可执行文件 2、(1) 将glut.h等所有头文件加入VC的相应文件夹中,即放入如下文件夹: C:\Program Files\Microsoft Visual Studio\VC98\Include\GL 将glut.dll等dll文件放到C:\WINDOWS\system32 将opengl32.lib等文件放到VC的的相应文件夹中,即放入如下文件夹:C:\Program Files\Microsoft Visual Studio\VC98\Lib 建立Win32的Console工程,在工程的设置中连接所有可能用到的静态库:opengl32.lib, glu32.lib; glaux.lib; glut32.lib; glut.lib。 实验源代码: // HighLevelShaders.c // OpenGL SuperBible, Chapter 21 // Demonstrates high-level shaders // Program by Benjamin Lipchak

计算机图形学实验报告(一).doc

实验一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),及颜色color float 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); else length=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

计算机图形学实验报告

计算机图形学实验报告 计算机图形学实验报告 引言 计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。 一、实验背景 计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。本次实验主要涉及三维图形的建模、渲染和动画。 二、实验内容 1. 三维图形建模 在实验中,我们学习了三维图形的表示和建模方法。通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。这些基本操作为后续的图形处理和渲染打下了基础。 2. 光照和着色 光照和着色是图形学中重要的概念。我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。3. 纹理映射 纹理映射是一种将二维图像映射到三维物体表面的技术。通过将纹理图像与物

体的顶点坐标相对应,我们可以实现更加细致的渲染效果。在实验中,我们学 习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的 效果。 4. 动画和交互 动画和交互是计算机图形学的重要应用领域。在实验中,我们学习了基本的动 画原理和算法,如关键帧动画和插值技术。通过设置动画参数和交互控制,我 们可以实现物体的平滑移动和变形效果,提升用户体验。 三、实验过程 在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。然后,我们 按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以 及动画和交互等任务。在实验过程中,我们遇到了许多挑战和问题,但通过不 断的尝试和调试,最终成功实现了预期的效果。 四、实验结果 通过实验,我们成功实现了三维图形的建模、渲染和动画效果。我们可以通过 键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。实验结果符合预期,并且在实验报告中附上了实验截图和代码片段供参考。 五、实验总结 通过本次计算机图形学实验,我深入了解了三维图形的建模和渲染原理,掌握 了OpenGL等图形库的使用方法。同时,我也学会了如何应用光照、纹理映射 和动画等技术,使图形更加真实和生动。通过实验,我不仅提升了编程能力, 还培养了团队合作和问题解决的能力。 六、展望未来

在OpenGL中实现橡皮筋技术画一个矩形,并学会简单的鼠标键盘交互式设备的使用以及交互式绘图技术的实现。共

计算机图形学实验报告 1、实验目的和要求 在OpenGL中实现橡皮筋技术画一个矩形,并学会简单的鼠标键盘交互式设备的使用以及交互式绘图技术的实现。 2、实验内容 橡皮筋技术的关键在于控制图形随着用户的操作而不断发生变化,此时要擦除原有的图形而形成新的图形。因此在本实验中要学习这种方法,并且画一个矩形。 3、实验步骤 1)相关算法及原理描述 鼠标响应函数: void MousePlot 在OpenGL程序中,使用鼠标的方法是注册一个鼠标响应函数,对鼠标在窗口范围内的按键按下或松开事件进行处理,其中MousePlot函数是鼠标响应函数,它包含四个参数: void MousePlot (Glint Button,Glint xMouse,GLint action ,Glint yMouse) 此外GLUT还提供了两用于处理鼠标移动的注册函数 GluMotionfunc(MouseMove) GluPassiveMotionFunc(PassiveMouseMove) 2)程序调试、测试与运行结果分析 运行结果如下图,程序调试成功,并且能正常显示,不足之处:调试了半天,右键显示及调节属性的功能仍旧没法实现,最后不得不把那

个函数删掉,感觉很是遗憾。 4、实验总结 通过本次试验,进一步认识和理解了橡皮筋算法的基本算法思想,同时也对双缓存技术有了一些了解,由于自己不太擅长编程,所以有些功能还不能完全实现,但我会尽自己最大努力来克服自己的编程不足之处,多加练习。 5、附录 带注释的源程序 #include #include #include int x0,y0; int x1,y1; int x2,y2; int x3,y3; int width; int height=500; int first=500; int iPointNum = 0; //已确定点的数目 int winWidth = 400, winHeight = 300; //窗口的宽度和高度 bool have_square=false; int draw=0;

计算机图形学报告

沈阳航空航天大学 计算机图形学实验报告 班级:34140102学号:20130 姓名:成绩: 指导教师: 实验一:OpenGL绘制球体线框图 1.实验目的: 本实验要求熟悉OpenGL基本图元函数的使用。 通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础 2.实验要求: 编写一个程序,在窗口中显示一个旋转的球体线框,利用光标键可启动图形旋转切换视点。 3.实验过程: 先配置环境,把相关文件放到相应的文件夹 C:\Program Files\Microsoft Visual Studio\VC98\Include\GL C:\WINDOWS\system32 C:\Program Files\Microsoft Visual Studio\VC98\Lib 建一个新工程,比照pdf敲代码 再通过VC++进行编译

4.实验结果: 程序运行后,弹出窗口,使用光标键可使球体旋转。 代码:include #include #include #include #include void init(); void CALLBACK reshapae(GLsizei w,GLsizei h); void CALLBACK display(); GLfloat s, h; //回调函数,绘制窗口时调用 void CALLBACK display() { //清空窗口设置背景为白色 glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT);

计算机图形学实验报告

计算机图形学实验报告 引言 计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。 实验目的 1. 了解计算机图形学的基本概念和发展历程; 2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等; 3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。 实验准备 在开始实验之前,我们需要准备一些实验所需的工具和环境。首先,确保计算机上安装了图形学相关的软件,如OpenGL或

DirectX等。其次,为了编写和运行图形学程序,我们需要掌握基 本的编程技巧,如C++或Python语言,并了解相关的图形库和API。 实验过程 1. 实现平移、旋转和缩放 首先,我们需要掌握图形学中的基本几何变换,如平移、旋转 和缩放。通过矩阵运算,我们可以很方便地实现这些变换。例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移: P' = T * P 其中,P'是平移后的点,T是平移矩阵。类似地,我们可以用 旋转矩阵和缩放矩阵来实现旋转和缩放效果。 2. 实现光照模型

光照模型是指在计算机图形学中模拟现实光照效果的一种方法。它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。 其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。 通过计算每个像素的光照强度,我们可以实现阴影效果和光源反 射等功能。 3. 实现三角形剪裁 三角形剪裁是计算机图形学中一种常用的几何算法,用于确定 哪些像素需要绘制,哪些像素需要剔除。通过对三角形的边界和 视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提 高图形渲染的效率。 4. 实现图形绘制 图形绘制是计算机图形学中的核心内容,它包括了点、线和面 的绘制等。通过设定顶点坐标和属性(如颜色、纹理等),我们 可以使用算法绘制出各种形状的图像。其中,常用的绘制算法有Bresenham算法和扫描线算法等。

计算机图形学实验一:画直线

贵州大学实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

如果 d<0,则M在理想直线下方,选右上方P1点; 如果 d=0,则M在理想直线上,选P1/ P2点。 由于d是xi和yi的线性函数,可采用增量计算提高运算效率。 1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为: d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a= d old-dy 2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为 d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a+b= d old-dy+dx 在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。 为了消除d的分数,重新定义 F(x,y)=2(ax+by+c) 则每一步需要计算的d new 是简单的整数加法 dy=y1-y0,dx=x1-x0 d0=-2dy+dx d new=d old-2*dy,当 d old>=0 d new=d old-2(dy-dx),当d old<0 Bresenham画线算法 算法原理: 与DDA算法 相似,Bresenham 画线算法也要在 每列象素中找到 与理想直线最逼 近的象素点。 根据直线的 斜率来确定变量 在x或y方向递 增一个单位。另 一个方向y或x

计算机图形学实验报告

实验报告 一、实验目的 1、掌握有序边表算法填充多边形区域; 2、理解多边形填充算法的意义; 3、增强C语言编程能力。 二、算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间所有点都是多边形的内部点。所以,对所有的扫描线填充入点到出点之间所有的点就可填充多边形。 判断扫描线上的点是否在多边形之内,对于一条扫描线,多边形的扫描转换过程可以分为四个步骤: (1)求交:计算扫描线与多边形各边的交点; (2)排序:把所有交点按x值递增顺序排序; (3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间; (4)着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。 p1,p3,p4,p5属于局部极值点,要把他们两次存入交点表中。如扫描线y=7上的交点中,有交点(2,7,13),按常规方法填充不正确,而要把顶点(7,7)两次存入交点表中(2,7,7,13)。p2,p6为非极值点,则不用如上处理。

为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。 对每一条扫描线都建立一个与它相交的多边形的活性边表(AET)。每个AET的一个节点代表一条活性边,它包含三项内容 1.x -当前扫描线与这条边交点的x坐标; 2.Δx -该边与当前扫描线交点到下一条扫描线交点的x增量; 3.ymax -该边最高顶点相交的扫描线号。 每条扫描线的活性边表中的活性边节点按照各活性边与扫描线交点的x值递增排序连接在一起。 当扫描线y移动到下一条扫描线y = y+1时,活性边表需要更新,即删去不与新扫 描线相交的多边形边,同时增加与新扫描线相交的多边形边,并根据增量法重新计算扫描线与各边的交点x。 当多边形新边表ET构成后,按下列步骤进行: ①对每一条扫描线i,初始化ET表的表头指针ET[i]; ②将ymax = i的边放入ET[i]中; ③使y =多边形最低的扫描线号; ④初始化活性边表AET为空; ⑤循环,直到AET和ET为空。 ●将新边表ET中对应y值的新边节点插入到AET表。 ●遍历AET表,将两两配对的交点之间填充给定颜色值。 ●遍历AET表,将 ymax= y的边节点从AET表中删除,并将ymax> y的各 边节点的x值递增Δx;并重新排序。 ●y增加1。 三、程序源代码 #include "graphics.h" #define WINDOW_HEIGHT 480 #define NULL 0 #include "alloc.h" #include "stdio.h" #include "dos.h" #include "conio.h"

计算机图形学实验报告

《计算机图形学》 实验报告 学号: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; //点击鼠标时点的取值 第三步:向视图类中添加自定义的成员函数原型:

相关主题