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

计算机图形学实验(全)

计算机图形学实验(全)

实验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 abs(dy))

epsl=abs(dx);

else

epsl=abs(dy);

xIncre=(float)dx/(float)epsl;

yIncre=(float)dy/(float)epsl;

for(k=0;k

#include

void BresenhamLine(int x0,int y0,int x1,int y1,int color) {

int x,y,dx,dy,e;

dx=x1-x0;

dy=y1-y0;

e=-dx;x=x0;y=y0;

while(x0){

y++;

e=e-2*dx;

}

}

}

main(){

int gdriver ,gmode ; gdriver = DETECT;

initgraph( BresenhamLine(0, 0 , 120, 200,5 );

getch ( );

closegraph ( );

}

实验2 圆和椭圆的绘制

实验目的

1、通过实验,进一步理解和掌握中点算法;

2、掌握以上算法生成椭圆或圆的基本过程;

3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

2学时,必做实验。

实验内容

用中点(Besenham)算法实现椭圆或圆的绘制。

实验步骤

1.算法、原理清晰,有详细的设计步骤;

2.依据算法、步骤或程序流程图,用C语言编写源程序;

3.编辑源程序并进行调试;

4.进行运行测试,并结合情况进行调整;

5.对运行结果进行保存与分析;

6.打印源程序或把源程序以文件的形式提交;

7.按格式书写实验报告。

分析与思考

1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?

2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?实验代码:圆:

#include

#include void CirclePoint(int x,int y,int color) {

putpixel(x+100,y+100,color);

putpixel(-x+100,y+100,color);

putpixel(x+100,-y+100,color);

putpixel(-x+100,-y+100,color);

putpixel(y+100,x+100,color);

putpixel(y+100,-x+100,color);

putpixel(-y+100,x+100,color);

putpixel(-y+100,-x+100,color);

}

void MidBresenhamCircle(int r,int color) {

int x,y,d;

x=0;y=r;d=1-r;

while(x=0)

putpixel(x,y,value);

getch();

if(aymax)

max=ar[i][1];

if (ar[i][1]xr)

c=RIGHT;

if(y>yb)

c=BOTTOM;

else if(y

c=TOP;

if(x==xl||x==xr||y==yt||y==yb) c=0; *code=c;

}

C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt) { int x,y,code1,code2,code3,code;

encode(x1,y1,

encode(x2,y2,

encode(x3,y3,

while(code1!=0||code2!=0)

{

if(code1

code=code1;

if(code1==0)

code=code2;

if((LEFT

y=y1+(long)(y2-y1)*(xl-x1)/(x2-x1); }

else if((RIGHT

y=y1+(long)(y2-y1)*(xr-x1/x2-x1); }

else if((BOTTOM

x=x1+(long)(x2-x1)*(yb-y1)/(y2-y1); }

else if((TOP

x=x1+(long)(x2-x1)*(yt-y1)/(y2-y1); if(code==code1)

{x1=x;

y1=y;

encode(x,y, }

else

{x2=x;

y2=y;

encode(x,y,

}

}

while(code1!=0||code3!=0) {

if(code1

code=code1;

if(code1==0)

code=code3;

if((LEFT

y=y1+(long)(y3-y1)*(xl-x1)/(x3-x1); }

else if((RIGHT

y=y1+(long)(y3-y1)*(xr-x1/x3-x1); }

else if((BOTTOM

x=x1+(long)(x3-x1)*(yb-y1)/(y3-y1); }

else if((TOP

x=x1+(long)(x3-x1)*(yt-y1)/(y3-y1); }

if(code==code1)

{x1=x;

y1=y; encode(x,y,

}

{x3=x;

y3=y;

encode(x,y,

}

}

while(code3!=0||code2!=0) {

if(code3

code=code3;

if(code3==0)

code=code2;

if((LEFT

y=y3+(long)(y2-y3)*(xl-x3)/(x2-x3); }

else if((RIGHT

y=y1+(long)(y2-y3)*(xr-x3/x2-x3); }

else if((BOTTOM

x=x1+(long)(x2-x1)*(yb-y3)/(y2-y3); }

else if((TOP

x=x1+(long)(x2-x1)*(yt-y3)/(y2-y3); }

if(code==code3)

{x1=x;

y1=y; encode(x,y,

}

else

{x2=x;

y2=y;

encode(x,y,

}

}

setcolor(RED);

line(x1,y1,x2,y2); line(x1,y1,x3,y3); line(x2,y2,x3,y3); return;

}

void main()

{

int graphdriver=DETECT,graphmode;

initgraph( rectangle(xl,yt,xr,yb);

line(x1,y1,x2,y2);

line(x1,y1,x3,y3);

line(x2,y2,x3,y3);

C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt); getch();

closegraph();

}

实验截图:

实验6 曲线生成算法的实现

实验目的

了解曲线生成的原理,掌握几种常见的曲线生成算法,利用TurboC实现Bezier曲线的生成算法。

实验环境

计算机、Turbo C或其他C语言程序设计环境

实验学时

2学时,必做实验。

实验内容

(1) 了解曲线生成的原理;

(2) 掌握曲线生成算法(Bezier曲线、B样条曲线);

(3) 利用TurboC实现Bezier曲线的生成算法,在屏幕上任意绘制一条三次Bezier曲线。

实验步骤

1、算法、原理清晰,有详细的设计步骤;

2、依据算法、步骤或程序流程图,用C语言编写源程序;

3、编辑源程序并进行调试;

4、进行运行测试,并结合情况进行调整;

5、对运行结果进行保存与分析;

6、打印源程序或把源程序以文件的形式提交;

7、按格式书写实验报告。

实验代码:

#include "graphics.h"

#include "malloc.h"

#include "math.h"

#define MULTIPLE 7

#define ROW 4

struct node{

float x,y;

}; void draw_polygon(struct node a[],int originx,int originy) {

int n;

for (n=0;n

if (n==0) moveto(originx+a[0].x,originy-a[0].y);

lineto(originx+a[n].x,originy-a[n].y);

}

}

struct node decasteljau(struct node p[],int n,float u)

{

int i,r;

struct node point,q[20];

for(i=0;i

q[i]=p[i];

for(r=1;r

for(i=0;i

q[i].x=(1.0-u)*q[i].x+u*q[i+1].x;

q[i].y=(1.0-u)*q[i].y+u*q[i+1].y;

}

return q[0];

}

void draw_bezier_curve(struct node p[],int n,int x0,int y0) { int i,x,y;

float u,delta;

struct node point;

delta=1.0/(float)(MULTIPLE*ROW);

for(i=0,u=0;u<=1.0;i++,u=u+delta){

point=decasteljau(p,n,u); if(i==0)moveto(x0+point.x,y0-point.y);

lineto(x0+point.x,y0-point.y);

}

}

main()

{

int gdriver=DETECT,gmode;

int number,n,originx,originy;

struct node a[]={{120,0},{45,0},{0,45},{0,120}}; initgraph(

originx=getmaxx()/2;

originy=getmaxy()/2;

setcolor(BLUE);

draw_polygon(a,originx,originy);

本文格式为Word版,下载可任意编辑 setcolor(RED);

draw_bezier_curve(a,ROW,originx,originy);

getch();

closegraph(); }

实验截图:

第11页共11页

计算机图形学实验指导书(vc++版)

实验指导书 刘文涛 2013

目录 第一章图形学实验环境和要求 (4) 1.1 VC++实验环境 (4) 1.1.1 基本环境 (4) 1.1.1 开发图形程序的一般流程 (7) 1.1.3 基本绘图函数介绍 (11) 1.2 OpenGL (22) 1.2.1 OpenGL介绍 (22) 1.2.2 OpenGL开发环境 (24) 1.2.3 OpenGL函数 (24) 1.2.4 回调函数 (25) 1.2.4 一个典型OpenGL例程 (26) 1.3 实验要求 (29) 1.3.1 实验内容 (29) 1.3.2 实验方法 (29) 1.3.3 实验效果 (30) 第二章直线生成算法 (30) 2.1 实验原理 (30) 2.1.1 DDA算法 (30) 2.1.2 Bresenham算法 (30) 2.2 实验内容 (30) 2.3 参考示例程序 (30) 第三章圆和椭圆生成算法 (32) 3.1 实验原理 (32) 3.2 实验内容 (32) 3.3 参考示例程序1 (32) 3.4 参考示例程序2 (33) 第四章裁剪算法 (35) 4.1 实验原理 (35) 4.2 实验内容 (35) 4.3 示例程序 (35) 4.3.1 参考例子1 (35) 4.3.2参考例子2 (38) 第五章二维变换 (40) 5.1 实验原理 (40) 5.2 实验内容 (40) 5.3 示例程序 (40) 5.3.1参考例子1 (40) 第六章三维变换 (44)

6.1 实验原理: (44) 6.2 实验内容 (45) 6.3示例程序 (45) 第七章填充算法 (47) 7.1 实验原理: (47) 7.2 实验内容 (47) 7.3示例程序 (47) 第八章曲线曲面 (50) 8.1 实验原理 (50) 8.2 实验内容 (50) 8.3示例程序 (51) 8.3.1 参考例子(1) (51) 8.3.2 参考例子(2) (52) 8.3.3 参考例子(3) (54) 8.3.4 参考例子(4) (56) 第九章真实感图形绘制 (59) 9.1 实验原理 (59) 9.2 实验内容 (59) 9.3示例程序 (59) 9.3.1参考例子(1) (59) 9.3.2参考例子(2) (61) 9.3.3参考例子(3) (63) 第十章动画 (66) 10.1 实验原理 (66) 10.2 实验内容 (66) 10.3示例程序 (66) 10.3.1 参考例子 (66) 参考文献: (72)

计算机图形学实验报告

计算机图形学 实验报告 学号: 姓名: 班级:计算机 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.实现直线生成的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.编辑菜单资源

计算机图形学实验报告三

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

//glEnable(GL_SCISSOR_TEST); //glScissor(0.0f,0.0f,500,300); glutWireTeapot(0.4); glFlush(); } //窗口调整子程序 void myReshape(int w, int h) { glViewport(500, -300, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1); else glOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5); } 2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。 }

//绘图子程序 void display(void) { glColor3f(1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); //glMatrixMode(GL_MODELVIEW); //glLoadIdentity(); //设置光源的属性1 GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 ) GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 ) GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射 GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1); glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient1); // 设置环境光 glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse1); // 设置漫射光 glLightfv(GL_LIGHT0, GL_SPECULAR, Lightspecular1);//设置镜面反射光 //设置光源的属性2 GLfloat LightAmbient2[] = { 0.0f, 1.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )

计算机图形学实验

实验三 MFC画直线 最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮 助 第一步:构建MFC窗体 打开Visual C++ 6.0编译器新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC 窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。 第二步:编辑菜单项 选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目属性”对话框。ID:ID_DRAW_LINE;标明: DrawLine(&D),其它的为缺省。 第三步:建立消息命令 如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。 通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function…”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。 第四步:添加鼠标消息响应 打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、 WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。 第五步:添加响应代码 首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag; POINT m_pPrev; POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应 处添加如下代码: //建立好绘图的设备环境 CClientDC dc(this); OnPrepareDC(&dc);

安徽大学计算机图形学实验

安徽大学计算机图形学实验代码(Turbo C) 实验1 直线的绘制 实验内容 用DDA算法或Besenham算法实现直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码: #include "graphics.h" void MidBresenhamline(int x0,int y0,int x1,int y1,int color) { int dx,dy,d,UpIncre,DownIncre,x,y; if(x0>x1) { x=x1;x1=x0;x0=x; y=y1;y1=y0;y0=y; } x=x0;y=y0; dx=x1-x0;dy=y1-y0; d=dx-2*dy; UpIncre=2*dx-2*dy; DownIncre=-2*dy; while(x<=x1) { putpixel(x,y,color); x++; if(d<0) { y++; d+=UpIncre; }

else d+=DownIncre; } } 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

计算机图形学实验三

太原工业学院实验报告

GetClientRect(&rect);//获得客户区的大小 pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系 pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围 pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y轴垂直向上 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点 CDC memDC;//内存DC CBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图 memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入memDC memDC.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,否则是黑色 memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系memDC.SetWindowExt(rect.Width(),rect.Height()); memDC.SetViewportExt(rect.Width(),-rect.Height()); memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); DrawWindowRect(&memDC);//绘制窗口 if(PtCount>=1) { memDC.MoveTo(Round(P[0].x),Round(P[0].y)); memDC.LineTo(Round(P[1].x),Round(P[1].y)); } pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存memDC中的位图拷贝到显示pDC中 memDC.SelectObject(pOldBitmap);//恢复位图 NewBitmap.DeleteObject();//删除位图 } (2)绘制裁剪窗口 void CTestView::DrawWindowRect(CDC* pDC)//绘制裁剪窗口 { // TODO: Add your message handler code here and/or call default pDC->SetTextColor(RGB(128,0,255)); pDC->TextOut(-10,Wyt+20,CString("窗口")); CPen NewPen3,*pOldPen3;//定义3个像素宽度的画笔 NewPen3.CreatePen(PS_SOLID,3,RGB(255,128,0)); pOldPen3=pDC->SelectObject(&NewPen3); pDC->Rectangle(Wxl,Wyt,Wxr,Wyb); pDC->SelectObject(pOldPen3); NewPen3.DeleteObject(); }

计算机图形学实验报告

计算机图形学 实验报告 实验一:二维线画图元的生成 实验目的:掌握直线段的生成算法,并用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 直线得绘制 实验目得 1、通过实验,进一步理解与掌握DDA与Bresenham算法; 2、掌握以上算法生成直线段得基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段得绘制. 实验环境 计算机、TurboC或其她C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0与1之间得直线段得绘制. 实验步骤 1、算法、原理清晰,有详细得设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件得形式提交; 7、按格式书写实验报告. 实验代码:DDA: #include 〈graphics、h〉 #include <math、h> 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 ; ? gdriver = DETECT; ?initgraph(&gdriver,&gmode ,"C:\\TC20\\BGI”); DDALine(0,0,35,26,4); getch ( ); ?closegraph (); } Bresenham: #include〈graphics、h〉 #include〈math、h> void BresenhamLine(int x0,int y0,int x1,int y1,int color) { int x,y,dx,dy,e; dx=x1-x0; dy=y1—y0; e=-dx;x=x0;y=y0; while(x〈=x1){ putpixel(x,y,color); x++; e=e+2*dy; if(e〉0){ y++; e=e-2*dx; } } } main(){ int gdriver ,gmode ; gdriver = DETECT; initgraph(&gdriver , &gmode ,”c:\\TC20\\BGI"); BresenhamLine(0, 0 ,120, 200,5 ); getch ( ); closegraph (); }

计算机图形学实验报告(一).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基本使用

学生实验实习报告册 学年学期:2016-2017学年 春□√秋学期 课程名称:大学计算机基础 学生学院:通信与信息工程学院 专业班级: 学生学号: 学生姓名: 联系电话: 重庆邮电大学教务处印制

实验实习名OpenGL基本使用 指导教师秦红星考核成绩 课程名称计算机图形学A 课程编号 实验实习地点信息科技大厦S306 完成日期 学生姓名学生学号 学院专业广电与数字媒体类所在班级 教师评语 教师签名: 年月日 一、实验实习目的及要求 目的: 认识了解OpenGL的性质、功能 要求: 1.利用OpenGL绘制一个简单的场景:比如球体、正方体 2.加入灯光 3.实现交互操作:平移、缩放、旋转 二、实验实习设备(环境)及要求(软硬件条件) 采用Microsoft Visual C 2010生成环境并用C++编写程序 三、实验实习内容与步骤 内容: 背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。 步骤: 建立立体-->添加光照-->添加变换 1.先写“主函数”,在主函数中将窗口生成好。 2.在“自定义函数1”中对窗口进行清除、填色等操作。 3.在“自定义函数1”中设置点光源,设置光照的各种参数。 4.在“自定义函数1”中设置平移、缩放、旋转及各参数。 5.在“自定义函数2”中设置平移和缩放的循环。 6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。实现动画。 四、实验实习过程或算法(源程序、代码) #include

计算机图形学matlab实验报告

姓名:_刘奔__________ 学号: 20124223 学院: 理学院 专业班级: 地理信息系统一班 论文标题: 计算机图形学实验报告 2014年6月25日

Matlab绘图实验 一、实验目的: 1、掌握MATLAB的基本绘图函数。 2、掌握绘图函数的用法、简单图形标注、简单颜色设定。 二、实验要求: 独立进行实验,完成实验报告。 三、实验内容: 1、MATLAB简介:MATLAB语言丰富的图形表现方法,使得数学计算结果可以方便地、多样性地实现了可视化,这是其它语言所不能比拟的。 2、MATLAB的绘图功能: (1)二维绘图: A、plot——最基本的二维图形指令:1. 单窗口单 曲线绘图;2. 单窗口多曲线绘图;3. 单窗口多曲线分图绘图;4. 多窗口绘图;5.可任意设置颜色与线型;6.图形加注功能;7.fplot——绘制函数

图函数;8.ezplot ——符号函数的简易绘图函数 B 、fill ——基本二维绘图函数:绘制二维多边形并填充颜色 (2) 三维绘图: A 、三维线图:plot3——基本的三维图形指令 B 、三维网格图:mesh ——三维网线绘图函数 C 、三维表面图:surf ——三维曲面绘图函数,与网格图看起来一样 四、作业: 1、(1)在同一幅图上的(-pi ,pi )区间,用0.5的间隔绘制sinx 的红色曲线,用0.1的间隔绘制sin(x+0.5)的绿色曲线,用0.01的间隔绘制sin(x+1)的蓝色曲线。 (2)给图的x 和y 轴添加标注。 2、在[-2*pi,pi]区间以0.1的间隔绘制5cos(x.^2+1)的曲线。 3、编辑M 文件,实现函数4xexp (-(x.^2+y.^2))的各种图形,包括三维线性图、网眼图、曲面图,并对他们分别加图题和标注坐标轴 4、编辑M 文件,实现函数 22() (,)(cos6cos6) x y f x y e x y -+=+

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glMatrixMode(GL_PROJECTION); } void DDALine(int x0,int y0,int x1,int y1) { 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); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); winWidth=newWidth; winHeight=newHeight; } int main(int argc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return 0; }

计算机图形学实验报告

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

计算机图形学实验报告

实验报告 一、实验目的 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"

相关主题