计算机图形学报告讲解

计算机图形学报告讲解
计算机图形学报告讲解

成都理工大学

计算机图形学课程设计三维真实感图形设计与绘制

学生姓名:郭耀中

学号:201108030309

年级专业:软件工程4班

学院:信息科学与技术学院

四川·成都

提交日期:2014年4月

2

目录

一、简要说明 (3)

二、实验题目 (3)

1.题目内容说明: (3)

2.技术要点说明 (3)

三、需求分析 (4)

1.课题设计思路 (4)

四、三维图形的设计过程 (5)

1.三维图形设计的过程如下: (5)

2.设计过程说明: (6)

五、三维图形的主程序 (7)

1.部分源码 (7)

六、设计结果 (14)

七、设计小结 (21)

一、简要说明

OpenGL(Open Graphic Library) 是由SGI公司的 IRIS GL 图形库发展而来的三维真实感图形生成工具, 鉴于它的跨平台、高质量、高效率、功能等特点,已经成为各种平台下的三维图形制作及交互式场景处理的工业标准,被广泛地运用于科学计算可视化、计算机动画和虚拟现实等计算机图形学热点问的解决之中。在 Windows 平台下,OpenGL 和 DirectX 是两个开发三维图形应用程序的标准,OpenGL 提供了二维和三维建模、变换、光线处理、色彩处理、纹理映射、运动模糊、动画和实时交互等功能,是绘制真实感三维图形、建立三维交互场景、实现虚拟现实的高性能图形开发工具软件包。与 DirectX 相比,用 OpenGL 来绘制三维地形具有图形质量高、程序可移植性好等优点。

本文充分利用三维图形库 OpenGL 卓越的渲染能力,在 Visual C++ 6.0环境下开发了一种基于 OpenGL 的三维真实感图形显示和渲染的工具

二、实验题目

三维真实感图形设计与绘制

1. 题目内容说明:

(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。程序功能要求:

1)用对话方式实现交互式的光照、材质模型参数设计。

2)交互式的模型纹理映射功能

3)用鼠标跟踪球方法实现三维模型的空间旋转

2. 技术要点说明

1)三维模型显示场景树

所谓三维场景树是指将三维可视化模型场景内容分解用一种树或表数据结构描述。

2)建立一个合理程序设计类结构

三、需求分析

真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。

在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。真实感图形学是计算机图形的核心内容之一,是最能直接反映图形学魅力的分支。

寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。

在计算机的图形设备上实现真实感图形必须完成的四个基本任务。

1. 三维场景的描述。三维造型。

2. 将三维几何描述转换成为二维透视图。透视变换。

3. 确定场景中的所有可见面。消隐算法,可见面探测算法。

4. 计算场景中可见面的颜色。根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小和色彩组成。

1. 课题设计思路

要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。

场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发。

三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。一般,设计三维图形软件要经过以下步骤:

(1)图元建立三维模型。

(2)设置观看物体的窗口和观看点(视点)。

(3)设定各物体的属性(如色彩、光照、纹理映射等)

(4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。

(5)三维图形的二维化。

四、三维图形的设计过程

1. 三维图形设计的过程如下:

(1) 建立三维模型

建立三维模型,就是在三维坐标系中画三维场景。利用画点(Point)、画线(Line)、画多边形(Polygon)等函数可以建立复杂的空间模型。在表示三维空间时,一般用齐次坐标(Homogeneous Coordinate)。在实际应用时一般把一系列顶点(Vertex )组织起来以构成物体或图元。

(2) 置窗口和视口

图形显示的区域称为显示窗口。流程顺序为:定义一个窗口一般由以下步骤完成:设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置

清理窗口是指把窗口清成某种颜色。

要观看场景,也需要一个窗口,即视口。通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。

下面就是一个简单视窗的代码:

void myDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glRectf(-0.5f, -0.5f, 0.5f, 0.5f);

glFlush();

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow("第一个 OpenGL 程序");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形

(3) 设置光照

要使物体具有真实感,就要对物体进行光照处理。在计算机图形学中,物体的真实感应考虑两种因素:光源和物体材质。

OpenGL 在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL 中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

(4)控制材质

材质与光源相似,也需要设置众多的属性。不同的是,光源是通过 glLight*函数来设置的,而材质则是通过 glMaterial*函数来设置的。

glMaterial*函数有三个参数。第一个参数表示指定哪一面的属性。可以是GL_FRONT、GL_BACK 或者 GL_FRONT_AND_BACK。分别表示设置“正面”“背面”的材质,或者两面同时设置。(关于“正面”“背面”的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。

2. 设计过程说明:

首先,为了绘制三维分形图形,我们先要建立数学模型。物体的三维模型的建立,需要向计算机输入三维数据,而在实际应用中,三维数据的输入是一个复杂的问题,需要用曲线、曲面拟合的方法建立模型。因此要根据不同的三维分形图形的具体情况,寻找合适的方法来建立它们各自的数学模型。

其次,要在计算机上进行三维分形的算法实现。在显示设备上逼真地显示出建立的模型,需要对原始图形数据进行坐标变换、隐藏面消除和明暗处理,最后

生成所要显示的真实感图形。针对不同的三维分形图形,如何采取合适的方法在计算机上实现,需要通过对问题的具体分析后进行选取。

五、三维图形的主程序

1. 部分源码

main函数源码:

#include"stdafx.h"

#include

#include

#include

GLfloat xrot; // 绕X轴旋转的角度。

GLfloat yrot; // 绕Y轴旋转的角度。

GLuint texture[6]; // 存储6个面。

int LastXPos,LastYPos; //上次鼠标点击处x、y坐标。

BOOL IsLBDown = FALSE; //鼠标左键是否按下。

读取纹理文件

//加载失败是返回null

AUX_RGBImageRec *LoadBMP(char *Filename) // 加载图片。

{

FILE *File=NULL;

if (!Filename) // 确保的到了文件名。

{

return NULL; // 如果没得到就返回空。

}

File=fopen(Filename,"r"); // 检查文件是否存在。

if (File) // 文件是否存在?

{

fclose(File); // 关闭文件。

return auxDIBImageLoad(Filename); // 加载图片并返回指针。

}

return NULL; // 加载失败返回空。

}

加载纹理设置纹理模式并绑定纹理

int LoadGLTextures() // 加载图片并贴在表面上。

{

int i;

char filename[128];

//此处一次加载6个纹理

AUX_RGBImageRec *TextureImage[6]; // 创建纹理的存储空间。

memset(TextureImage,0,sizeof(void *)*6); // 设置指针为空。

// 加载图片,检查错误,如果图片不存在就退出。

for(i=0;i<6;i++)

{

sprintf(filename,"Data/%d.bmp",i+1);

TextureImage[i] = LoadBMP(filename);

if(!TextureImage[i])

{

char msg[256];

sprintf(msg,"Cannot read the file : %s",filename);

MessageBox(NULL,msg,"Error",MB_OK);

return FALSE;

}

}

glGenTextures(6,texture);

for(i=0;i<6;i++)

{

glBindTexture(GL_TEXTURE_2D,texture[i]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);

if(TextureImage[i]->data)

free(TextureImage[i]->data);

free(TextureImage[i]);

}

return TRUE; //返回状态。

}

响应窗口发生变化事件

GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 调整大小和初始化GL窗口。

{

if (height==0) // 防止为0.

{

height=1; // 为0是改为1.

}

glViewport(0,0,width,height); // 设置当前视口。

glMatrixMode(GL_PROJECTION); // 选择投影矩阵。

glLoadIdentity(); // 复位投影矩阵。

// 计算窗口的纵横比

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW); // 选择的模型视图矩阵。

glLoadIdentity(); //重置模型观察矩阵。

}

//场景初始化

int InitGL(GLvoid) // 所有的设置。

{

//加载纹理

if (!LoadGLTextures()) // 纹理加载程序。

{

return FALSE; // 如果纹理不加载返回false。

}

//启用纹理贴图

glEnable(GL_TEXTURE_2D); // 使用纹理映射。

glShadeModel(GL_SMOOTH); // 使光滑阴影。

glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景。

//深度检测

glClearDepth(1.0f); // 深度缓冲区设置,

glEnable(GL_DEPTH_TEST); // 允许深度测试。

glDepthFunc(GL_LEQUAL); // 做深度测试的类型。

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真实感的角度计算。

//启用光源

GLfloat mat_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };

GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };

GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat mat_shininess[] = { 50.0f };

GLfloat light0_diffuse[] = { 1.0f, 0.0f, 0.0f, 1.0f };

GLfloat light0_position[] = { 0.0f, 0.0f, 21.0f, 0.0f };

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);//指定材质的环境反射光的反射系数。

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);//制定材质的漫反射光反射系数。

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);//制定材质的镜面反射光反射系数。

glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//制定材质的镜面反射指数值。

glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//指定漫反射光成分。

glLightfv(GL_LIGHT0, GL_POSITION, light0_position);//设置光源位置。

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_DEPTH_TEST);

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

return TRUE; // 初始化成功。

}

下面的代码完成绘制网格线

void drawPlane()

{

glColor3f(1.0f, 1.0f, 1.0f);

for (float u = -8.0; u <= 8.0; u += 0.5f)

{

glBegin(GL_LINES);

glVertex3f(-8, 0, u);

glVertex3f(8, 0, u);

glVertex3f(u, 0, -8);

glVertex3f(u, 0, 8);

glEnd();

}

}

void MyDisPlay(void)

{

glPushMatrix();

glRotatef(30, 9.0, -6.0, 0.0);

drawPlane(); //绘制网格。

glPopMatrix();

glTranslated(3.0f, -1.0f, 2.0f);

glutSolidSphere(1.0f, 20, 20);//绘制球体。

glPopMatrix();

glTranslated(3.0f, 0.5f, 0.0f);

glutSolidTeapot(1.0);//绘制茶壶。

glPopMatrix();

glTranslated(-2.5f, 1.5f,-7.0f);

glRotatef(60, -1.0, 0.0, 0.0);

glutSolidCone(1.0f, 3.0f, 99, 1); //绘制圆锥。

glPopMatrix();

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glFlush();

}

绘制6面体,并响应鼠标的拖动旋转

void DrawGLScene(GLvoid) // 这里做所有的绘画。

{

glClearColor(0.0, 0.0, 255.0, 0.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓冲区。

glLoadIdentity();

glTranslatef(-3.0f,1.0f,-8.0f); //将场景向里面平移5个单位

glRotatef(xrot,1.0f,0.0f,0.0f); //沿x轴旋转

glRotatef(yrot,0.0f,1.0f,0.0f); //沿y轴旋转

//绘制6面体并分别进行纹理绑定

//前面。

glBindTexture(GL_TEXTURE_2D, texture[0]);

glBegin(GL_QUADS);

glNormal3f( 0.0f, 0.0f, 1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glEnd();

// 后面。

glBindTexture(GL_TEXTURE_2D, texture[1]);

glBegin(GL_QUADS);

glNormal3f( 0.0f, 0.0f,-1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glEnd();

//上面。

glBindTexture(GL_TEXTURE_2D, texture[2]);

glBegin(GL_QUADS);

glNormal3f( 0.0f, 1.0f, 0.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glEnd();

// 下面,

glBindTexture(GL_TEXTURE_2D, texture[3]);

glBegin(GL_QUADS);

glNormal3f( 0.0f,-1.0f, 0.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd();

// 右面。

glBindTexture(GL_TEXTURE_2D, texture[4]);

glBegin(GL_QUADS);

glNormal3f( 1.0f, 0.0f, 0.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glEnd();

// 左面。

glBindTexture(GL_TEXTURE_2D, texture[5]);

glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glEnd();

MyDisPlay();

//xrot+=xspeed;

//yrot+=yspeed;

glutSwapBuffers();

}

处理鼠标按下事件

void processMouse(int button, int state, int x, int y) { //鼠标左键按下

if (button == GLUT_LEFT_BUTTON && state==GLUT_DOWN) {

int xPos,yPos;

xPos = x;

yPos = y;

LastXPos = xPos;

LastYPos = yPos;

IsLBDown = TRUE;

}

//鼠标左键弹起

if(button == GLUT_LEFT_BUTTON && state==GLUT_UP)

{

IsLBDown = FALSE;

}

}

//处理鼠标拖动事件

void processMouseActiveMotion(int x,int y)

{

if(IsLBDown) //若鼠标左键被按下

{

int xPos,yPos;

xPos = x;

yPos = y;

xrot += GLfloat(yPos - LastYPos) / GLfloat(5.0);

yrot += GLfloat(xPos - LastXPos) / GLfloat(5.0);

LastXPos = xPos;

LastYPos = yPos;

}

}

Main主函数

void main(int argc, char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

glutInitWindowSize(1000, 600);

glutInitWindowPosition(100, 100);

glutCreateWindow("三维真实感图形");

InitGL();

glutDisplayFunc(DrawGLScene);

glutIdleFunc(DrawGLScene);

glutReshapeFunc(ReSizeGLScene);

//加入鼠标处理回调。

glutMouseFunc(processMouse);

glutMotionFunc(processMouseActiveMotion);

glutMainLoop();

}

六、设计结果

下面是几张图。。展示设计结果

计算机图形学实验报告

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

计算机图形学实验

实验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 ;

cad制图实习报告

cad制图实习报告 篇一:CAD画图实习报告及总结 CAD实习报告 经过这学期的理论和上机学习,使我们对有了基本掌握,对于CAD这个课程学习也有了一个系统的学习和掌握。我学到的东西很多。首先对于电脑绘图不熟悉的我有很大的帮助,现在的我用Auto CAD绘图的速度快了很多。而且知道了很多快捷方式的运用。以下就是我在CAD实习过程中知道的一些小技巧。现在,我们即将结束这门课程,作为CAD学习的学生,大部分人都想以后成为一名建筑师,更好的去设计出符合企业单位,满足客户的要求,并深受大家喜爱的作品。这是在老师讲的人体工程学里面找的。CAD即计算机辅助设计与制图,是指运用计算机系统辅助一项设计的建立、修改、分析或优化的过程。 CAD软件必须有能接受和使其运行的物体,即硬件来 支持它才能有实际意义,这样就存在了CAD系统。CAD系统是由硬件、软件组成。硬件包括处理运算设备、图形显示设备、外部存储设备、数据图形输入输出设备以及有关的信息传输等硬件平台设备、软件包括系统软件、支撑(图形、汉字等)软件和专业应用软件。我国主要使用的CAD软件是美国AUTODESK公司开发的AUTODESK软件,它是一个功能强大、易学易用、具有开放型结构的软件口不

仅便于用户使用,而且系统本身可不断地扩充和完善,它被广泛地应用于微机及工作站上。因此,国内外软件开发商在此基础上进行有关工程设计专业的二次开发,如建筑行业:华远的HOUSE软件、建研院的ABD集成化软件BICAD软件、理正的CAD软件、方圆公司的方圆三维室内设计系统等。随着CAD技术的不断发展,其覆盖的工作领域也不断地扩大,如工程设计CAD项目的管理、初步设计、分析计算、绘制工程、统计优化等。CAD技术的应用正在有力而迅速地改变着传统的工程设计方法和设计生产的管理模式。 一、课程实习的目的: 把握Auto CAD用于工程制图的基本操作,了解工程图纸绘制的格式和要求,能够用Auto CAD绘制二维的工程图纸。 二、课程实习的任务: 1.学习Auto CAD的基本绘图操作。 2.绘制平面工程图纸。 3.了解工程图纸的一般要求和格式 三、课程设计的要求: 本课程实习以CAD软件为例,介绍计算机辅助设计的功能和应用,并作一定的实践操作。要求学生了解Auto CAD 的主要功能,把握Auto CAD用于工程制图的基本操作,了解工程图纸绘制的格式和要求,能够用Auto CAD绘

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

课程实习报告4篇

课程实习报告4篇 本文是关于课程实习报告4篇,仅供参考,希望对您有所帮助,感谢阅读。 §案情简述 被告人姚某因为和妻姐的财务纠纷,将其杀死并自首。故意杀人罪名无可争议,但是在量刑上却有较大争论,在庭审过程之中,围绕量刑问题,原告和被告之间展开了激烈的争论。 §本案争论的逻辑 法院在量刑上应作一个判断: 对被告人应 1)量重刑或2)量轻刑 为做出以上判断,需要考虑以下条件 →①姚某是否属于自首悔罪②姚某主观恶性是强还是弱 如果自首悔罪,主观恶性较弱,此案必将轻判,反之将重判。并且这两点是紧密联系的,双方都非常注意在这方面找出有利于自己的证言。 由此双方争论由此交结在"预谋"这一要素之上。先来看看"预谋"这个概念。 有预谋→意味着主观恶性强,是有计划的,严密的杀人,社会危害大。即使其自首也可以认为是预谋之中的事。并且,供词中的"有预谋"和庭审中姚某辩称自己是一时冲动杀人矛盾,使得被告人姚某的自首情节中"需要坦白自己一切罪行"(包括自己的动机)不能成立,因此自首行为亦值得商榷。 无预谋→意味着姚某只是无意杀人,而非有计划的。主观恶性较弱,社会危害小,加之有自首行为,姚某的罪行可以轻判。姚某就处于较为有利一些的地位。 双方都非常清楚这次交锋的关键点,围绕是否有预谋这个作案动机进行了以事实为依据的大讨论。原告方希望置被告方于死的,被告方希望取得较为有利得地位,通过各种论证和反驳通过各种命题去达到自己的目的。 其一§对于姚某"预谋已久"的论证和反驳 原告为了证明被告人预谋已久,心怀不轨,提出了一下三个证据。 证据一:被告人姚某,携带刀具和雷管进入马某家中,其必然是早有准备,

证据二:被告人姚某,砍被害人20余刀直至对方身亡,由此可见姚某主观恶性之强,预谋之深。 证据三:姚某在伤人之后,并没有仔细观察对方生死,或者拨打120急救电话。放任对方生死,姚某只是区公安机关自首,但并不能认定其自首是悔罪表现,或许只是惧怕重刑。说以其主观恶性更深,更能证明其是有预谋的杀人。 一、课程实习的目的: 把握auto cad用于工程制图的基本操作,了解工程图纸绘制的格式和要求,能够用auto cad绘制二维的工程图纸。 二、课程实习的任务: 1.学习auto cad的基本绘图操作。 2.绘制平面工程图纸。 3.了解工程图纸的一般要求和格式 三、课程设计的要求: 本课程实习以cad软件为例,介绍计算机辅助设计的功能和应用,并作一定的实践操作。要求学生了解auto cad的主要功能,把握auto cad用于工程制图的基本操作,了解工程图纸绘制的格式和要求,能够用auto cad绘制二维的工程图纸。 四、意义: 随着传统cad系统在工业界的应用以及现代设计问题的复杂化、智能化,人们不再仅仅满足于用计算机取代人进行手工绘图。所幸随着计算机图形学、人工智能、计算机网络等基础技术的发展和计算机集成制造、并行工程、协同设计等现代设计理论和方法的研究,使得cad系统也由单纯二维绘图向三维智能设计、物性分析、动态仿真方向发展,参数化设计向变量化和vgx(超变量化)方向发展,几何造型、曲面造型、实体造型向特征造型以及语义造型等方向发展;另一方面,伴随着cad软件复杂程度的增加和各个不同应用系统间互操作的现实需要,人们希望cad系统具有极佳的开放性,同时又能“搭积木”似的自由拼装形成不同的功能配置,软件工程技术非凡是组件开发技术的研究应用和逐渐成熟为解决这一问题提供了坚实的基础。

计算机图形学实验报告

目录

实验一直线的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) {

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[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日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

研究生实习报告

研究生暑期社会实践报告 姓名: 班级: 学号: 专业:

一:实习时间:2016年7月20日—2016年8月20日 二:实习地点:技术有限公司 三:实习目的: 实习的质量关系到自己相关专业能力的提升,作为大学期间最重要的实习之一,让学生进一步了解专业背景,把在校期间的学习和实践结合起来,发现自己的不足,温故已学过的知识。在校文化课的学习仅仅使我对本专业理论知识有一定的了解,但在实践过程中我们需要查阅相关的文献和资料来解决我们所遇到的问题,这进一步加深我们对专业的相关发展背景有了更加清晰的了解与更准确的直观认识。在不断的学习中,积累了知识和经验,为将来就业快速发展打下坚实的基础。更重要的是,使我们不但开阔了思路,增长了见识,在学习和实践中锻炼了自己的实际操作和解决问题的能力。自身整体素质的提高使我受益匪浅。 四:实习公司简介: -获德图像技术有限公司是一家致力于机器视觉高新技术领域内各种自动 检测设备的开发、研制和销售的综合型高技术企业。该公司机器视觉和图像处理技术在玻璃纤维(电子布、多轴向、格子布、短切毡)、无纺布、帘子布,晶片、纺织、医用辅料等表面质量检测的研究一直处于国内领先地位。 公司常年与“陕西省2011产业用纺织品协同创新中心”及“陕西省纺织印染自动化工程技术研究中心”合作,依托数字图像处理、模式识别以及机器视觉技术,多次成功的解决了纺织用品和工业板材表面缺陷检测难题,提高产品质量。公司非常重视和高校合作,先后开发出多种机器视觉教学实验平台,培养学生在机器视觉方面的创新实践能力。 目前公司拥有发明专利4项,实用新型专利10余项,软件著作权3项。公司团队骨干研发成员由来自浙江大学、 -交通大学、 -电子科技大学以及 -工程大学等学校博士、硕士,平均行业工龄超过十年以上,为公司的研发生产提供了根本性和技术上的保证。

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

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

一、实验目的 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维齐次坐标空间的一条直线:

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科15升-1班 学号 1516353004 姓名 指导教师王玉琨 2016 年 06 月 07 日

目录 设计内容与要求 (03) 总体目标和要求 (03) 内容与要求 (03) 总体设计 (03) 2.1 球的消隐处理基本原理 (03) 2.2 具体设计实现 (04) 详细设计 (04) 3.1调试后正确的程序清单 (04) 功能实现 (08) 4.1程序运行结果 (09) 4.2 功能实现及分析 (09) 总结 (09) 参考文献 (10)

球体背面剔除消隐算法 第 1章设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统, 并能从某些方面作出评价和改进意见。 通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C++ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容:(1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

计算机图形学报告

中南大学 计算机图形学 实验报告 学生姓名谭淼 学号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、实验中遇到的问题及处理方法

相关文档
最新文档