计算机图形学报告——太阳系

计算机图形学报告——太阳系
计算机图形学报告——太阳系

Solar System

计算机图形学

课程报告

文档编号:报告名称:算法设计编写:谢天添05编写日期:2009-12指导老师:李征审核日期:

1 图形学基本原理........................................... 错误!未定义书签。

几何变换相关原理................................. 错误!未定义书签。

几何图形像素化相关原理........................... 错误!未定义书签。

光照模型相关原理................................. 错误!未定义书签。

2 系统界面与操作说明(阐述如何操作你的软件)............... 错误!未定义书签。

系统界面与图形显示示例........................... 错误!未定义书签。

操作说明(配合图示进行说明)..................... 错误!未定义书签。

3 源程序:................................................. 错误!未定义书签。

太阳系概述:..................................... 错误!未定义书签。

数据收集:....................................... 错误!未定义书签。

类设计:......................................... 错误!未定义书签。

Main Class ................................... 错误!未定义书签。

辅助类:..................................... 错误!未定义书签。

模块增强类:................................. 错误!未定义书签。

功能设计:....................................... 错误!未定义书签。

反锯齿:..................................... 错误!未定义书签。

帧率......................................... 错误!未定义书签。

大气云层..................................... 错误!未定义书签。

太阳特效..................................... 错误!未定义书签。

流动..................................... 错误!未定义书签。

Glow: .................................... 错误!未定义书签。

光属性....................................... 错误!未定义书签。

代码实现:....................................... 错误!未定义书签。

Star 类:.................................... 错误!未定义书签。

Galaxy 类:.................................. 错误!未定义书签。

Cskysphere 类:.............................. 错误!未定义书签。

C4_Antiliasing 类:.......................... 错误!未定义书签。

ChaseCamera 类:............................ 错误!未定义书签。

C4_Selector 类:........................... 错误!未定义书签。

main 函数.................................... 错误!未定义书签。

4 小结..................................................... 错误!未定义书签。

总结在原理理解、程序设计中所遇到的困难是如何解决的,可以举出1至2个例子。................................................. 错误!未定义书签。

总结本门课程所学到的知识。....................... 错误!未定义书签。

5 参考文献................................................. 错误!未定义书签。

6 运行截图................................................. 错误!未定义书签。

1图形学基本原理

1.1几何变换相关原理

几何变换所涉及坐标系和变换如下:

Object coordinates---modelview Matrix

eye coordinates—projectionmatrix

clip coordinate----perspectiveMatrix

normalized device coordinates---viewportTransformation

window coordinates.

1.2几何图形像素化相关原理

几何图形像素化就是几何图形经过一系列的变换后储存在帧缓存中的图形,经过其他的一些操作后,将输出到屏幕坐标。由于光栅化前这些坐标是浮点连续的。而屏幕坐标系是离散的像素点。几何图形像素画就是将这些连续的图形变为离散的像素点集并且确保正确的渲染。如果没有该步骤,几何图形是不能渲染到使用像素的屏幕坐标。

1.3光照模型相关原理

点光源:向四面八方发射光线的单点。

聚光灯光源:从特定地点射向特定方向的光源。

平行光源:从无限远处射来的点光源。

面光源:从一个平面发出平行光的光源。

最终的每个像素color输出为几何点在光珊化中环境光,漫反射和镜面光的叠加。

2系统界面与操作说明(阐述如何操作你的软件)

2.1系统界面与图形显示示例

左下角:camera的数据,当前帧率。

2.2操作说明(配合图示进行说明)

在该太阳系中,提供以下几个键:

F:摄像机到目标物体的距离增加5。

R:摄像机到目标物体的距离减少5。

[:开启或关闭反锯齿。

鼠标左键按住不放时,左右上下移动改变摄像机相对目标物体的位置,

但是不改变距离

选取一个星球,摄像机自动飞向该星球:

未操作前截图:

按F后

按R:

鼠标左键不放左上拖动

选取一个星球,摄像机自动飞向该星球:

过程图片:

到达图片:

目前在反据此模式下,点击“[”关闭反锯齿:

这里只有通过帧数的改变显示出改变

3源程序:

3.1太阳系概述:

太阳系(Solar System)就是我们现在所在的恒星系统。它是以太阳为中心,和所有受到太阳引力约束的天体的集合体:8颗行星冥王星已被开除、至少165颗已知的卫星,和数以亿计的太阳系小天体。这些小天体包括小行星、柯伊伯带的天体、彗星和星际尘埃。广义上,太阳系的领域包括太阳、4颗像地球的内行星、由许多小岩石组成的小行星带、4颗充满气体的巨大外行星、充满冰冻小岩石、被称为柯伊伯带的第二个小天体区。在柯伊伯带之外还有黄道离散盘面、太阳圈和依然属于假设的奥尔特云。

模拟太阳系不仅仅是完成作业,也能让我们更近一步的了解太阳系,拓广知识面,对行星的运行有基本的感性和理性感知。增加我们对宇宙探索的渴望,可能培养出又一批天文学家。

3.2数据收集:

要模拟太阳系的运行首先需要他们的数据,这里我收集了“9”大行星,太阳,月球数据如下:

行星a(AU)轨道

周期

(yr)i(deg)e自转周期

自转轴

倾斜(度)质量(地球)

半径

(地

球)

水星0

金星244d-2

地球

火星

木星318

土星

天王星

海王星

冥王星248122

10^3km d10^20kg km

月球3857301738

a=轨道半长轴

i=轨道倾角

e=轨道偏心率

1AU=0km

质量和半径是对于地球的相应值的相对值

地球质量=*10^27次方

地球赤道半径=6378km

以上每列数据是每个星球必有的。通过这些属性,以地球为标准,获取行星的运动方程就可以模拟出行星的运动轨迹和位置等数据。现在还需要的外部数据就是:每个行星的纹理。在纹理选择上。我使用的是分辨率为256*256 RBGA 的tga格式文件。使用自己编写的一个类resourceImage 派生于 C4_Image.读取该纹理。以在渲染时使用。

在这个程序中,假设所有星球的运动轨迹是圆。而非椭圆。这样就简化了程序在编写时的复杂度。并且假设程序不考虑万有引力。

3.3类设计:

在该太阳系中类图关系如下:

3.3.1Main Class

baseGameEntity:提供的最主要功能为:为每一个实体提供一个独特的ID.以便为绑定纹理,选择,提供方便,以免冲突。

MovingEntity:提供实体的up,front,speed等参数。

Galaxy:是星系的抽象体,他具有个天空球(CSkySphere)和他所包含的星球(star)的集合。Star:是一个星球的抽象实体。他具有表中的属性,除此还有一个CSkySphere。这里CSkySphere作为该星球的球体渲染时的纹理和顶点信息。由于每个星球可能也有他的卫星,他的卫星也可能还有卫星。所以每个star中都有一个star的集合.

ChaseCamera:提供围绕一个星球旋转的功能;

提供调整到星球距离的功能;

C4_Image:从文件加载32位,24位或8位tga格式的纹理。保存到一个unsigned char 数组中。

ResourceImage:对C4_Image进行扩展。可以加载DDS_DX1_decals_compressed,DDS_DX1_CUBMAP 两类文件。但是由于DDS_DX1_CUBMAP 显示分辨率太低,所以就没有用cubmap.这使得没有使用cubmap而是使用自己写的天空球来模拟环境纹理。

3.3.2辅助类:

类图如下:

这6个类为辅助类,每一个需要渲染的物体都有一个C4_Material.

matrix3D matrix4D,vector3D,vector4D 提供基本的几何运算,不用多说。

C4_Light 提供创建8个光源实例。在程序中使用了1个光源。

3.3.3模块增强类:

所谓模块增强类,就是提供更好的图形显示或更多的功能。类图如下:

该太阳系提供3个增强模块,3个功能:

1),C4_Selector :对派生于baseGameEntity的物体提供鼠标选择功能。

2),C4_Antialiasing :提供全局的antialiasing,反锯齿(反走样),使用的是glaccum. 3), C4_CgEffect :提供高级顶点,片段编程。基于NVADIA的.(opengl version:>=)以上为对程序的一些类的简介。不过大体就这15个类。(2,3运行截图请参看附录)

3.4功能设计:

3.4.1反锯齿:

在太阳系中使用了2组jitter系数,让projection matrix产生微小位移,然后渲染物体。将两次渲染的结果累计到缓存区,然后渲染出来。使用前后对比:

前后

使用的样本数据:

double j2[][2]={{,},{,}}; (参考the red book 累积缓冲区)

在使用glCalllist 调用一个非常冗余的圆的渲染时在开启反锯齿后在同样的情况下,每秒的帧数只有6帧/秒,而改进之后帧数达到了9帧/秒左右。

在原来情况下每个顶点要被渲染4次。改进后每个点被渲染2次。如果要进一步的该进,就要使用索引。由于时间关系就不再优化。以下为改进前和改进后的性能对比。

改进前:

改进后

对比。

由该表可以看出glAccum所使用的时间之巨大,也可以让我们了解到渲染时顶点越少越好。

3.4.2帧率

但是如果不开启反锯齿,改进前和改进后的区别基本上没有。都是20帧左右。但是,不过为什么无论我怎么调,该帧数都不变。例如将太阳系中的行星删除掉80,禁用光源,但是帧数依然不变。最终发现是glutTimerFunction中设置问题。开始设置的1/。而后当我设置成1/时。帧数变为32帧左右。当我继续减少该值的时候。无反锯齿下,最多可以达到66帧,反锯齿下反而有所降低到8~9帧。但是此时又有一个问题。当帧数载66帧左右的时候。有某个瞬间尤其不稳定可能突然渲染时间降低到以下或突然上升到。此时.就需要一个采样的队列对时间进行采样使得物体和镜头的移动更加平滑。在程序中我使用了一个最简单的方法,求最近n次的平均帧长。这里应该设置一个比率。越早的数据权重应该越低。以下为部分代码。

#define FRAMESAMPLESIZE 100

int curframeSample=0;

float frame[FRAMESAMPLESIZE]={0};

curframeSample=(curframeSample+1)%FRAMESAMPLESIZE;

frame[curframeSample]=time_eclipse;

updateTime=0;

for(int i=0;i

{

updateTime+=frame[i];

}

updateTime/=FRAMESAMPLESIZE;

这样问题也很多,例如每次runtime更改程序引起的帧改变要过一段时间才能反应真实的帧率。这里就不多说了。

现在要解决的问题是如何让反锯齿状态下帧速率更高。

如果将全局的glAccum换为对每个物体进行积累的话:也就是将glAccum换到每一个物体上去的话会不会有更好的效果结果是不会,帧数降低到1帧。除了将glAccum换到局部去渲染每个行星外,没有任何变化情况下的函数调用时间比例。

对比值

可以看出。glAccum在一次渲染中不能过多的调用,很消耗资源。

目前使用glaccum还没找到好的方法。

3.4.3大气云层

地球大气有云层。所以可以在地球上添加一个有云纹理的球,然后混合,混合代码如下。bool bEnable=glIsEnabled(GL_BLEND);

bool bCullEnable=glIsEnabled(GL_CULL_FACE);

if(!bEnable)

glEnable(GL_BLEND);

if(bCullEnable)

glDisable(GL_CULL_FACE);

glDepthMask(false);

glEnable(GL_ALPHA_TEST);

glAlphaFunc(GL_GREATER ,0);

glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA);

glScalef,,;

this->m_pAtmosphere->Render();

glDisable(GL_ALPHA_TEST);

if(!bEnable)

glDisable(GL_BLEND);

if(bCullEnable)

glEnable(GL_CULL_FACE);

glDepthMask(true);

截图如下:

从左到右分别为:太阳,月球,金星,地球。

由于没找到好的云图片,效果就只有这样了。不过这依然还需要改进。

3.4.4太阳特效

太阳应该看起来有一点流动效果,并且太阳的周围应该还有飞出的火焰,也就是类似于光晕的光圈。这就有2个问题。1,流动,2,光圈(glow)。

3.4.4.1流动

流动如果在常规的管道流程中来生成,对太阳的每个顶点进行变换或纹理。是比较耗费时间的。所以这里在程序中使用了NVIDIA的cg(支持及其以上)。我的电脑最多支持,所以就只有用cg所支持的fragment shader和 vertex shader.这里只是对顶点进行放缩。

float displacement = scaleFactor * *sin * frequency * time)+1;

float4 displacementDirection = float4, , , 0);

float4 newPosition = position + displacement * displacementDirection;

oPosition = mul(modelViewProj, newPosition);

这里,对于每个顶点,都会在其法向量方向进行震动。具有相同y值的顶点会有相同的幅度,在法线方向的长度相同。这样又y值的不一样,在视觉上就有起伏感觉。而在modelviewproj构造时会有一个根据时间增加的旋转值。这样看起来每个顶点都在起伏并且移动。在贴了纹理后就有点流体的感觉。

这是在使用cg时的太阳这是在没有使用时的图片

但是太阳的反锯齿由于cg的特性(在渲染cg前的所有其他非cg的函数操作都对其没有作用)而变没了。

3.4.4.2Glow:

目前我在opengl下还没弄出来………不过班上有同学在dx下已经弄出来了。

3.4.5光属性

如果你查看附录的图像时,你会发现及时是很远的行星向光面都很亮,因为光的衰减函数如下:

F(x)=1/(1+;

Y

x

0 1000AU

3.5代码实现:

只将关键代码罗列如下:

3.5.1Star 类:

/*

*/

#pragma once

#include""

#include""

#include""

#include

/*

a star has a skysphere to show its outside pattern

*/

class Star :

public MovingEntity

{

private:

CSkySphere *m_sSphere;

C4_Material m_c4Mat;

std::vector *m_pvSatellite;

char m_szStarName[10];

CSkySphere *m_pAtmosphere;

public:

Star(int id,

float inMass,float inRadiu,

float inAU,float inYr,float inDeg,float inE,

const char*texFileName,

float inRPeriod=0,float inRotInc=0,

const char*starName="NONE");

~Star(void);

public:

float m_fDeg; ,CameraMgr->getPos().y,CameraMgr->getPos().z};

cgSetParameter3fv(m_pCgEffect->getVsParam("eyePosition"),eyePosition);

Vector4D v=ProjectM*viewM*Vector4D(1,0,0,1);

cgSetParameter3dv(m_pCgEffect->getVsParam("lightPosition"),());

cgSetParameter1d(m_pCgEffect->getVsParam("time"),time);

m_pCgEffect->UpdateFsParam();

m_pCgEffect->UpdateVsParam();

if(this->isSelectEnable())

{

glLoadName(this->getID());

}

::C4_checkForCgError("before rendering scene");

this->m_sSphere->Render();

m_pCgEffect->DisableTexture("sun");

m_pCgEffect->EndVsEffect();

m_pCgEffect->EndFgEffect();

return;

}

#endif

ErrorCheck1("before render star");

glPushMatrix();

ga

/ (GLfloat) iStacks;

GLfloat dtheta = * (GLfloat)(3.) / (GLfloat) iSlices;

GLfloat ds = / (GLfloat) iSlices;

GLfloat dt = / (GLfloat) iStacks;

GLfloat t = ;

GLfloat s = ;

GLint i, j; This however introduces texturing

.);

void Axis();

void ErrorCheck(char* string);

void Init();

:

changeTarget=!changeTarget;

break;

case'[':

if(g_pAntil)

g_pAntil=NULL;

else

g_pAntil=ComPonentAntiAnliase;

break;

case 27 :

exit(0);

break;

default:

break;

}

glutPostRedisplay();

}

\n";

.)

{

va_list args;

char buffer[255], *s;

va_start(args, format);

vsprintf(buffer, format, args);

va_end(args);

glRasterPos2i(x, y);

for (s = buffer; *s; s++)

glutBitmapCharacter(font_style, *s);

}

float lastFrame=0;

void PrintHelp()

{

int step=16;

int uper=200;

f %.3f

%.3f)",(float)g_pCamera->getPos().x,(float)g_pCamera->getPos().y,(float)g_pCamera->getPos(). z);

drawstr(10+3*12,uper-=step,"Up:(%.3f %.3f

%.3f)",(float)g_pCamera->getUp().x,(float)g_pCamera->getUp().y,(float)g_pCamera->getUp().z);

drawstr(10,uper-=step,"Camera theta= %.3f",(float)g_pCamera->getTheta());

drawstr(10,uper-=step,"Camera gama= %.3f",(float)g_pCamera->getGama());

drawstr(10,uper-=step,"Target Pos:(%.3f %.3f

%.3f)",(float)g_pCamera->getTargetPos().x,(float)g_pCamera->getTargetPos().y,(float)g_pCamer a->getTargetPos().z);

f",updateTime>01/updateTime:0);

// drawstr(

}

void InitFog()

{

//set fog parameters

glEnable(GL_FOG);

GLfloat fogColor[4]={,,,};

glFogi(GL_FOG_MODE,GL_EXP);

glFogfv(GL_FOG_COLOR,fogColor);

glFogf(GL_FOG_DENSITY,;

glHint(GL_FOG_HINT,GL_DONT_CARE);

glFogf(GL_FOG_START,10);

glFogf(GL_FOG_END,200);

}

void InitGlowTexture()

{

glBindTexture(GL_TEXTURE_2D,2000);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

//filter

::glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

::glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

::C4_Image m;("image/glow/");

//get and draw

gluBuild2DMipmaps(GL_TEXTURE_2D,(),(),()

,(),GL_UNSIGNED_BYTE,());

}

4小结

4.1总结在原理理解、程序设计中所遇到的困难是如何解

决的,可以举出1至2个例子。

困难有一个:如何在opengl下实现glow(光晕)。找到了相关文章,但是是dx下面的,只有理论描述,没有代码参考。但是还没有解决该问题。

4.2总结本门课程所学到的知识。

本门课所学到的最重要的知识是将各个变换矩阵的行列完全弄清楚。

5参考文献

(1)参考文献列表

OpenGL 编程指南(原书第6版)

GPU gems

6运行截图

无反锯齿,启用cg使太阳流动

启用反据此,未启用cg

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用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.360docs.net/doc/be19051126.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

计算机图形学实验报告 (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))

计算机图形学课程设计报告

一、设计内容与要求 1.1、设计题目 算法实现时钟运动 1.2、总体目标和要求 (1)目标:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。 (2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。(3)开发环境:Viusal C++ 6.0 1.3、设计要求 内容: (1)掌握动画基本原理; (2)实现平面几何变换; 功能要求: (1)显示时钟三个时针,实现三根时针间的相互关系;

(2)通过右键菜单切换时钟背景与时针颜色; 1.4设计方案 通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。再根据OpenGL颜色模型定义当前颜色。设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。

二、总体设计 2.1、过程流程图

2.2、椭圆的中点生成算法 1、椭圆对称性质原理: (1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置; 通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。 2、中点椭圆算法内容: (1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。设置初始点(x0,y0)的位置为(0,r2); (2)计算区域1中央决策参数的初始值 p = ry*ry - rx*rx*ry + 1/4*(rx*rx); (3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束; <1>如果p < 0 ,绘制下一个点(x+1,y),并且计算 p = p + r2*r2*(3+2*x); <2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算 p = p + r2*r2*(3+2*point.x) - 2*r1*r1*(y-1) (4)设置新的参数初始值; p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry; (5)在区域2中的每个Yn为止,从n = 0开始,直到y = 0时结束。 <1>如果P>0的情况下,下一个目标点为(x,y-1),并且计算 p = p - 2rx*rx*(Yn+1) + rx*rx;

计算机图形学实验报告

目录

实验一直线的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(); }

计算机图形学实验报告记录

计算机图形学实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

计算机图形学实验报告 姓名:___ __________ 学号:_____ ________ 班级:______ _______ 时间:_____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 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) {

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

一、实验目的 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);

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号: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;

计算机图形学课程设计报告简单图形的绘制-

《计算机图形学》课程设计 报告 学生姓名:学号: 学院: 班级: 题目: 简单图形的绘制 职称2015年7月1日

目录 目录............................................................................................... I 一、选题背景 (1) 二、算法设计 (2) 2.1 绘制直线、圆、椭圆、抛物线 (2) 2.1.1 绘制直线 (2) 2.1.2 绘制圆 (2) 2.1.3 绘制椭圆 (2) 2.1.4 绘制抛物线 (2) 2.2 三维几何变换 (2) 三、程序及功能说明 (5) 3.1 绘制直线、圆、椭圆、抛物线...... (5) 3.1.1 绘制直线 (5) 3.1.2 绘制圆 (5) 3.1.3 绘制椭圆 (5) 3.1.4 绘制抛物线 (6) 3.2 图形的平移 (6) 3.3 图形的旋转 (6) 3.4 图形的缩放 (7) 四、结果分析 (7) 4.1 绘制直线、圆、椭圆、抛物线 (7) 4.1.1 直线 (7) 4.1.2 圆 (8)

4.1.3 椭圆 (8) 4.1.4 抛物线 (8) 4.2 图形的平移 (9) 4.3 图形的旋转 (10) 4.4 图形的缩放 (11) 五、总结 (10) 六、课程设计心得体会 (14) 参考文献 (15) 源程序 (16)

一、选题背景

二、算法设计 2.1 绘制直线、圆、椭圆、抛物线 2.1.1 绘制直线 通过两个点的坐标来绘制直线。计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有DDA 算法和中点算法。 2.1.2 绘制圆 通过运用圆的参数方程cos ;sin x a r y b r θθ=+=+来绘制圆的图形,其中[0,2]θπ∈, (a,b )为圆心,r 为半径,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。 2.1.3 绘制椭圆 通过运用椭圆的参数方程cos ;sin x a y b θθ==来绘制椭圆的图形,其中 [0,2]θπ∈,是已知的变量,a ,b 分别为长半轴,短半轴,当确定a 和b 后,通过参数方程即可得到这个椭圆的方程。 2.1.4 绘制抛物线 根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。 2.2 三维几何变换 三维几何变换是二维几何变换的推广。二维几何变换在齐次坐标空间中 可用3?3的变换矩阵表示,类似的,三维几何变换在齐次坐标空间中可用4?4的变换矩阵表示。三维空间中的点(),,x y z 的齐次坐标定义为(),,h h h x y z ,其中,h 为不等与零的任意常数,h x hx =,h y hy =,h z hz =。亦即点(),,x y z 对应4维齐次坐标空间的一条直线:

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学课程总结教材

计算机图形学报告 前言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 其从狭义上是来说是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。由于计算机图形学在许多领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。 计算机图形学的发展趋势包括以下几个方面: 1、与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点; 2、研究和谐自然的三维模型建模方法; 3、利用日益增长的计算性能,实现具有高度物理真实的动态仿真; 4、研究多种高精度数据获取与处理技术,增强图形技术的表现; 5、计算机图形学与图像视频处理技术的结合; 6、从追求绝对的真实感向追求与强调图形的表意性转变。 1、三维物体的表示 计算机图形学的核心技术之一就是三维造型三维物体种类繁多、千变万化,如树、花、云、石、水、砖、木板、橡胶、纸、大理石、钢、玻璃、塑料和布等等。因此,不存在描述具有上述各种不同物质所有特征的统一方法。为了用计算机生成景物的真实感图形,就需要研究能精确描述物体特征的表示方法。根据三维物体的特征,可将三维物体分为规则物体和非规则物体两类。 三维实体表示方法通常分为两大类:边界表示和空间分割表示,尽管并非所有的表示都能完全属于这两类范畴中的某一类。边界表示(B-reps)用一组曲面来描述三维物体,这些曲面将物体分为内部和外部。边界表示的典型例子是多边形平面片和样条曲面。空间分割表示(Space-Partitioning)用来描述物体内部性质,将包含一物体的空间区域分割为一组小的、非重叠的、连续实体(通常是立方体)。三维物体的一般空间分割描述是八叉树表示。本章主要介绍三维物体的各种表示方法及其特点。

计算机图形学报告

中南大学 计算机图形学 实验报告 学生姓名谭淼 学号23 专业班级应数1102班 指导老师刘圣军 数学与统计学院 2013年12月 实验目的:设计并实现一个简单动画(二维或三维)。熟悉并应用画线的基本算法—Bresenham算法。 实验过程: 1、实验步骤: (1)打开Visual Studio 2010,新建一个MFC项目,取名为tuxingxue,设置为单文档。 (2)打开类视图,添加一个名为Cline2D的类,在该类中添加BresenhamLine(CDC* pDC, int xa,float ya,int xb,float yb) DrawPixel(CDC* pDC, int x, float y, unsigned int color, int size); BresenhamLine1(CDC* pDC, int xa,float ya,int xb,float yb);

BresenhamLine2(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine3(CDC* pDC, int xa,float ya,int xb,float yb); BresenhamLine4(CDC* pDC, int xa,float ya,int xb,float yb); 以上函数的返回值类型均为void型。在中,分别在其中添加代码实现画线的功能,具体代码见附录中的源代码。 (3)画出基本图形。在中定义CLine2D 的一个对象为line1,以便调用CLine2D中的函数,此时在调用的函数中赋初始值即可画出最基本的图形,即为一颗大五角星以及三颗小的五角星。 (4)让画出的五角星动起来。从类视图中CtuxingxueView下添加名为OnTimer的消息处理函数,在中添加bool型变量m_flag,在OnTimer函数下添加代码,具体代码见附录。在添加变量int m_x1、int m_y1、int m_x2、int m_y2、int m_x3、int m_y3、int m_x4、int m_y4、int m_x5、int m_y5、int m_x6、int m_y6、int m_x7、int m_y7、int m_x8、int m_y8、int m_x9、int m_y9、int m_x10、int m_y10、 int m_x11、int m_y11、int m_x12、int m_y12。在中为这些变量赋初始值,将第三步中函数赋的初值用这些变量代替,这样变量的值可以改变,在资源视图中menu下IDR_MAINFRAME中添加名为绘图的菜单项,在绘图下添加名为运行的选项,其ID号为ID_run,添加事件处理程序,函数处理程序名称为Onrun,将其类选为C tuxingxueView,此时,在Onrun中添加代码,再运行就可以让图形动起来了。 2、实验中遇到的问题及处理方法

计算机图形学实验报告

计算机图形学 实验报告 学号: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编程函数绘制简单的图

计算机图形学课程设计报告

计算机图形学 课程设计报告 设计课题: 专业班级: 学号: 学生姓名: 指导教师: 设计时间:2018.12.06

中南林业科技大学涉外学院理工系计算机图形学课程设计任务书

指导教师:廖宁教研室主任: 2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。 课程设计任务书装订于设计计算说明书(或论文)封面之后,目录页之前。 目录 一.设计目的……………………………………………………………二.设计要求…………………………………………………………… 1.构建基础类…………………………………………………… 2.构建直线类…………………………………………………… 3.构建变换类…………………………………………………… 4.构建填充类…………………………………………………… 5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计 五.源程序 六.程序运行效果图 七.总结

设计目的 ?培养对图形建模、变换、投影、消隐、光照原理的理解和应用。 ?培养图形类的编程能力。 ?培养计算机图形学应用软件开发的能力。 设计要求 深入研究计算机图形学的生成原理,设计算法实现具体的类。 1.构建基础类 实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。 2.构建直线类 实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现

CACLine类绘制任意斜率的反走样颜色渐变直线。 3.构建变换类 实现CTransForm完成二维和三维图形变换。 4.构建填充类 实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进行深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。 5.构建光照类 实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。 开发环境 Viusal C++ 6.0的MFC框架。 详细设计 1.利用函数Ellipse画出人物的脸,并用给脸填充颜色。再利 用Ara画出人物的嘴巴。CRect确定人物的眼睛,给眼睛填 充颜色。利用画笔画出人物的鼻子。 2.添加ddaline()成员函数,编写自定义的成员函数ddaline ()程序,编写OnDraw()函数,画出人物的脚和脚趾。 3.添加星星star()成员函数,编写自定义的成员函数star() 程序,确定五角星的位置、大小和颜色。

计算机图形学实验报告

.

目录

实验一直线的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(); }

计算机图形学实验报告

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

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

计算机图形学课程设计实习报告范本

实验零 Visual C++ 2005绘图系统 地点:土木楼B401机房时间:星期三下午节次:第三大节 一、实验目的: 1. 了解Visual C++ 2005绘图的基本概念 2. 了解Visual C++ 2005绘图环境 3. 掌握用Visual C++ 2005设计绘图项目的基本步骤 4. 掌握用Visual C++ 2005绘图的基本命令 二、实验容: 实验容1:创建绘图应用程序主框架 实验容2:应用程序编译运行 实验容3:设置菜单项并生成消息响应函数 实验容4:SetPixel绘图 三、实验步骤: 实验容1:创建绘图应用程序主框架 步骤: 1.创建一个工作目录D:\MyProject 2.启动 Visual Studio 2005 3.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++” ->“MFC”,模版选择“MFC应用程序”。在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。

5.单击“下一步”按钮。 6.在“应用程序类型中”,选择“单文档”类型。 7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。 实验容2:应用程序编译运行 运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:

点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。 2.调试运行程序 点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。 结果如下:

生成Release解决方案步骤如下: 1.生成解决方案 点击“生成-〉批生成”。 2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。

相关文档
最新文档