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

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

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

Steps = abs(dx);

else

Steps = abs(dy);

xIncrement = dx/(float)Steps;

yIncrement = dy/(float)Steps;

pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));

for(k=0;k

{

x +=xIncrement;

y +=yIncrement;

sleep(10);

pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));

}

3、画矩形

void CRectangleDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

lButtonDownNotUp = TRUE;

RECT rect;

m_showRectangle. GetClientRect( &rect ) ;

if( (point. xrect. left) && (point. yrect. top) )

{

regionLeftTopTemp = point;

}

CDialog::OnLButtonDown(nFlags, point);

}

void CRectangleDlg::OnMouseMove(UINT nFlags, CPoint point)

{

RECT rect;

m_showRectangle. GetClientRect( &rect );

if( ( point.xrect.left ) && ( point.yrect.top ) )

{

if( ( lButtonDownNotUp == TRUE )

{

regionRightBottomTemp = point;

CDC * pDC = m_showRectangle. GetWindowDC ();

pDC -> Rectangle( CRect( regionLeftTopTemp, regionRightBottomTemp ) ) ;

}

}

CDialog::OnMouseMove(nFlags, point);

}

void CRectangleDlg::OnLButtonUp(UINT nFlags, CPoint point)

{

lButtonDownNotUp=FALSE;

CDialog::OnLButtonUp(nFlags, point);

}

实验二基本图形生成算法

一、实验类型:验证型实验

二、实验目的

1、掌握DDA、Bresenham直线生成算法;

2、掌握Bresenham或中点圆生成算法;

3、掌握Bresenham或中点椭圆生成算法;

三、实验内容

1、实现DDA、Bresenham直线生成算法;

2、实现Bresenham画圆法或中点画圆法;

3、实现Bresenham或中点法椭圆生成算法;

4、利用1、2、3实现的直线、圆、椭圆图形生成函数进行图形绘制;

四、实验要求与指导

1、按照实验指导书1.6节创建一个基于MFC的Single Document应用程序。建立名为“图形绘制”的菜单,该菜单的子菜单项可根据下图进行设定,用户通过点击不同的子菜单项,可以选择不同的算法进行绘图。

2、建立一个专门用于进行图形绘制的类,比如下图所示的CMyGL类。如无特

殊说明,今后都以该类作为演示。

3、所有图形的绘制算法都必须封装在CMyGL类中,如下图。

4、在View类中实例化一个CMyGL类的对象,比如m_gl,进行绘图操作。如下图所示:

5、用户通过点击“图形绘制”中不同的菜单项,在指定位置进行绘图。

五、实验结果:

六、实验主要代码

1、画直线:

void CDraw::DDALine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)

{

double dx,dy,e,x,y;

dx = x2 -x1;

dy = y2- y1;

e = (fabs(dx) > fabs(dy)) ? fabs(dx):fabs(dy);

dx/=e;

dy/=e;

x = x1;

y = y1;

for (int i=1;i<=e;i++)

{

pDC->SetPixel((int)(x+0.5),(int)(y+0.5),color);

x+=dx;

y+=dy;

}

}

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

Steps = abs(dx);

else

Steps = abs(dy);

xIncrement = dx/(float)Steps;

yIncrement = dy/(float)Steps;

pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));

for(k=0;k

{

x +=xIncrement;

y +=yIncrement;

sleep(10);

pDC->SetPixel(ROUND(x),ROUND(y),RGB(255,0,0));

}

3、画椭圆

void CDraw::BresenhamEllipse(CDC *pDC, int x0, int y0, int a, int b, COLORREF color) {

int x,y,p;

int aa=a*a,bb=b*b;

x=0;y=b; p=2*bb+aa*(1-2*b);

while (bb*x<=aa*y)

{

pDC->SetPixel(x+x0,y+y0,color);

pDC->SetPixel(-x+x0,y+y0,color);

pDC->SetPixel(x+x0,-y+y0,color);

pDC->SetPixel(-x+x0,-y+y0,color);

if(p>=0)

{

p+=4*aa*(1-y)+bb*(4*x+6);

y--;

}

else

{

p+= bb*(4*x+6);

}

x++;

}

x=a;y=0; p=2*aa+bb*(1-2*a);

while (bb*x>aa*y)

{

pDC->SetPixel(x+x0,y+y0,color);

pDC->SetPixel(-x+x0,y+y0,color);

pDC->SetPixel(x+x0,-y+y0,color);

pDC->SetPixel(-x+x0,-y+y0,color);

if(p>=0)

{

p+=4*bb*(1-x)+aa*(4*y+6);

x--;

}

else

{

p+= aa*(4*y+6);

}

y++;

}

}

实验三、 OpenGL图形程序设计基础

一.实验目的

1)了解OpenGL 图形库的功能和结构;

2)学习使用Visual C++ 开发基于控制台的图形程序;

3)学习使用Visual C++ 开发基于单文档(GUI 界面)的图形程序。

4)学习使用OpenGL 生成基本图形;

5)学习使用OpenGL 实现图形变换;

二.实验内容

1)使用Visual C++建立一个Win32 Console Application(控制台应用程序),定义若干点坐标,绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。尝试不同尺寸的点、不同线宽的线、设置颜色等操作。

2 )使用MFC AppWizard 建立一个SDI 程序,根据参考资料2 和3中的步骤设置OpenGL 图形绘制环境。增加绘制4种基本图形(选择其中之一)。

3.实验过程:

1)建立一个控制台应用程序,在RenderScene()函数中调用不同的系统函数分别绘制不同属性的点、线、折线、多边形、扇形等;

2)建立一个SDI程序,按照所给资料设置OpenGL图形绘制环境,并照敲老师所给实列,观看结果,查看关键代码区;

3)仿照所给列子,改写代码,绘制彩色的正方体;

三.实验结果

基本图形显示正确

基本图形截图:

三棱柱截图:

实验四、二维图形变换程序设计

一.实验目的:

1)掌握图形变换实现原理,基本几何变换,复合变换等;

2)学习使用Visual C++开发菜单,对话框等交互界面的设计;

3)学习使用MFC单文档程序,实现二维图形的基本几何变换。二.实验内容:

使用Visual C++建立一个单文档程序,采用实验二中定义的基本图形类。在程序中增加图形变换菜单(各基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现二维图形的变换。(提示:在各个图形类中增加相应的成员函数实现平移;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,通过调用图形变换成员函数实现图形对象的变换)。要求实现直线段、圆、多边形等基本图形的几何变换。

三.实验过程:

(1).根据实验要求,新建菜单,增加二维图形变换子菜单,然后在菜单上添加平移,比例,对称,旋转以及错切选项。

(2).对菜单中的每一项方法构造响应函数,并给几个需要弹出对话框的选项添加对话框响应函数。

(3).在弹出的对话框输入参数,获取输入的参数,调用相应的变换函数,实现图形的变换。

四.实验结果:

结果正确。

平移xy(100, 0)

五、实验主要代码

class CTransform//二维几何变换

{

public:

CTransform();

virtual ~CTransform();

void SetMat(CP2 *,int);

void Identity();

void Translate(double,double);//平移变换矩阵

void Scale(double,double);//比例变换矩阵

void Scale(double,double,CP2);//相对于任意点的比例变换矩阵void Rotate(double);//旋转变换矩阵

void Rotate(double,CP2);//相对于任意点的旋转变换矩阵

void ReflectOrg();//原点反射变换矩阵

void ReflectX();//X轴反射变换矩阵

void ReflectY();//Y轴反射变换矩阵

void Shear(double,double);//错切变换矩阵

void MultiMatrix();//矩阵相乘

public:

double T[3][3];

CP2 *POld;

int num;

};

void CTransform::Translate(double tx,double ty)//平移变换矩阵

{

Identity();

T[2][0]=tx;

T[2][1]=ty;

MultiMatrix();

}

void CTransform::Scale(double sx,double sy)//比例变换矩阵

{

Identity();

T[0][0]=sx;

T[1][1]=sy;

MultiMatrix();

}

void CTransform::Scale(double sx,double sy,CP2 p)//相对于任意点的整体比例变换矩阵{

Translate(-p.x,-p.y);

Scale(sx,sy);

Translate(p.x,p.y);

}

void CTransform::Rotate(double beta)//旋转变换矩阵

{

Identity();

double rad=beta*PI/180;

T[0][0]=cos(rad); T[0][1]=sin(rad);

T[1][0]=-sin(rad);T[1][1]=cos(rad);

MultiMatrix();

}

实验五、二维交互式图形程序设计

一、实验目的:

1)综合使用VC++编写Win32 应用的方法(单文档、多文档、对话框);

2 )掌握交互式绘图程序设计及MFC 相关类的使用;

3)掌握使用MFC 的编写简单动画程序。

二、实验任务:

1)使用MFC AppWizard 建立一个SDI 程序。综合前几次二维绘图

实验的结果,实现基本功能:

建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier )曲线的相关类(对于封闭图形,应能多种方式填充)、字符串。使用实验二中自定义的CClientDC 的派生类,实现交互式(鼠标)绘制以上图形。实现颜色、线型、字体等的交互式选择,实现除曲线、圆弧外其他图形的鼠标拾取(框选、点选)。

实现新建文件、保存文件,打开文件(打开保存的自定义图形文件,并绘制图形)。

软件界面设计(工具栏、菜单、光标等)。

可选扩展功能:

(1)实现平移、旋转、缩放、对称、错切等图形几何变换

(2)图形的显示控制包括缩放(按比例、选取框)、平移(上、小、左、右)。

(3)实现图层功能(可见性、颜色、锁定等)、图块功能(及选中

多个图形形成一组,图块的生成、引用、编辑)。

(4 )图形的显示控制包括实时缩放、实时平移和定点平移等。(5)图形的编辑控制包括撤销、重复、剪切、复制、粘贴、删除、清除。

2 )本任务是在以上程序的基础上,增加动画功能(可单独增加相应菜单):

交互式绘制三个圆作为太阳、地球、月球(要求填充,注意位置。数据放入文档类,即文档类有变量太阳、地球、月球等),实现二维动画:月球绕地球转、地球自转(地球采用图案填充)、地球绕太阳公转(按时间比例,可设置参数:时间、颜色、调整大小)。三、实验过程:

1)建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier )曲线的相关类

2)在菜单栏上增加相应的菜单,用来选择不同的功能

3)对增加的菜单栏设置ID,并且在View类中添加相应的事件响应函数,在各自的响应函数中实现各自的功能

四、实验结果:

基本功能:

扩展功能(做一个简单的太阳系):

在附加功能中,点击“开始”图形开始变换,点击“停止”图形静止。

计算机图形学实验报告

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

计算机图形学实验报告 (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.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架

(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。 (5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。 图1-2 信息程序基本 3.编辑菜单资源 设计如图1-1所示的菜单项。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。此时VC已自动建好程序框架,如图1-2所示。 表1-1菜单资源表 菜单标题菜单项标题标示符ID 直线DDA算法生成直线ID_DDALINE Bresenham算法生成直线ID_BRESENHAMLINE 中点算法生成直线ID_MIDPOINTLINE 4.添加消息处理函数 利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。 表1-2菜单项的消息处理函数 菜单项ID消息消息处理函数ID_DDALINE CONMMAN OnDdaline

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

计算机图形学实验报告

目录

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

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

大学实验报告 学院: 计算机科学与信息专业:计算机科学与技术班级:计科101 喻志华学号1008060024 实验组实验时间2013/3/30 指导教师吴云成绩实验项目名称圆和椭圆的生成算法 实 验目的 根据圆的Brensenham算法、中点算法和中点改进算法,以及椭圆的中点算法,编写程序,实现圆与椭圆的绘制。 实 验要求1.圆、椭圆的中点算法 2.圆的优化后的算法:二次差分法 3.编制源程序; 4.对于一些较为重要的算法,可以摘抄在报告中; 实验原理 1.中点算法 A.构造函数 F(X,Y)=X2+Y2-R2,则可知 F(M)< 0:M在圆,取T F(M)≥ 0:M在圆外,取 B B.第一个M点的值有: (一)DM0 = F(M0)= F(1,R-0.5)= 12+(R-0.5)2-R2=1.25-R 若 D=d-0.25 则判别式d<0等价于D<-0.25。即DM0=1-R与DM0=1.25-R等价。 (二)如果dM<0,表示下一中点M在圆,选择T点,且: dMT= F(MT)= F(xp+2,yp-0.5) 则: ?dMT= dMT - dM=2xp+3 (三)如果dM>0,表示下一中点M在圆外,选择B点,且: dMB= F(xMB,yMB)= F(xp+2,yp-1.5)则: ?dMB= dMB - dM=2xp-2yp +5 2.中点改进算法——增量算法

设圆上某点I(xi,yi);则下一点为J点,坐标为(xi+1,yj)dT=2xp+3; dB=2(xp-yp)+5; d1=d2=0; 因为x每次加1,所以 dj点 A.将增量?dMT=2(xi+1)+3=dT+2=dT+d1; (d1=d1+2) B.将增量?dMB=2(xi+1)-2yj+5=dB+d1+d2; dj较之于di,x部分增量增加相同的量,y部分两种情况 1.取T点,yj不减1,y部分增量的增量无变化 2.取B点,yj减1,y部分增量的增量加 2. 所以当y—时,d2=d2+2 因此,d<0, d=d+dT+d1; d>0, d=d+dB+d1+d2; 3.Brensenham算法 1.基本思想: 当|D(Ti)|≥|D(Bi)|,则Bi更接近于圆周,选择Bi; 当|D(Ti)|<|D(Bi)|,则Ti更接近于圆周,选择Ti; 若令D=|D(Ti)|-|D(Bi)| 则D≥0,取Bi; D<0,取Ti; 2.三种情况 A.设x0=0,y0=R;则T1为(1,R),B1为(1,R-1), d1=(12+R2-R2)+[(12+(R-1)2-R2]=3-2R B.若di<0,则取Ti作为下一点,即Pi(xi-1+1,yi-1); d(i+1)=di+4xi-1+6 C.若di≥0,则取Bi作为下一点,即Pi(xi-1+1,yi-1-1), d(i+1)=di+4(xi-1-yi-1)+10 4.椭圆的中点算法

计算机图形学实验指导书1

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

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

《计算机图形学》课程参考文献 [1 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.sodocs.net/doc/1a4707823.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.sodocs.net/doc/1a4707823.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.sodocs.net/doc/1a4707823.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.

计算机图形学实验

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

计算机图形学实验报告

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

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

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 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

计算机图形学实验报告

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

计算机图形学实验二

太原工业学院

实验拓展:绘制颜色渐变的三角形和四边形。 void CTriangle::Draw(CDC* pDC)//画出来一个三角形 { pDC->MoveTo(point0.x,point0.y); pDC->LineTo(point1.x,point1.y); pDC->LineTo(point2.x,point2.y); pDC->LineTo(point0.x,point0.y); } void CTriangle::GouraudShader(CDC* pDC) { SortVertex();//point0点为y坐标最小的点,point1点为y坐标最大的点,point2点的y坐标位于二者之间。如果y值相同,取x最小的点//定义三角形覆盖的扫描线条数 int nTotalScanLine = point1.y - point0.y + 1; //定义span的起点与终点数组 SpanLeft = new CPoint2[nTotalScanLine];//跨度左边数组 SpanRight = new CPoint2[nTotalScanLine];//跨度右边数组 //判断三角形与P0P1边的位置关系,0-1-2为右手系 int nDeltz = (point1.x - point0.x) * (point2.y - point1.y) - (point1.y - point0.y) * (point2.x - point1.x);//点矢量叉积的z坐标 if(nDeltz > 0)//三角形位于P0P1边的左侧 { nIndex = 0; DDA(point0, point2, TRUE); DDA(point2, point1, TRUE); nIndex = 0; DDA(point0, point1, FALSE); }

计算机图形学实验二报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目曲线拟合 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

曲线拟合 1. 实验内容 1. 绘制三次Bezier曲线 (1)给定四个已知点P1—P4,以此作为控制顶点绘制一段三次Bezier曲线。 (2)给定四个已知点P1—P4,以此作为曲线上的点绘制一段三次Bezier曲线。 2. 绘制三次B样条曲线 给定六个已知点P1—P6,以此作为控制顶点绘制一条三次B样条曲线。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析 1. 绘制三次Bezier曲线 Bezier曲线是用N+1个顶点(控制点)所构成的N根折线来定义一根N阶曲线。本次实验中的三次Bezier曲线有4个顶点,设它们分别为P0,P1,P2,P3,那么对于曲线上各个点Pi(x,y)满足下列关系: P(t)=[(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)]/6 X(t)=[(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)]/6 Y(t)=[(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6 其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。所以只要确定控制点的坐标,该曲线可通过编程即可绘制出来。 2. 绘制三次B样条曲线 三次B样条函数绘制曲线的光滑连接条件为:对于6个顶点,取P1、P2、P3、P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P5 这4个顶点绘制在第二段三次样条曲线,总计可绘制3段光滑连接的三次样条曲线。 4. 算法设计 程序框架 //DiamondView.h class CDiamondView : public CView { ……

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

清华大学计算机研究生课程表 清华大学计算机研究生课程表 计算机系研究生课程介绍 课程名称:组合数学 课程编号: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 开课学期:春

相关主题