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

计算机图形学实验(全)

计算机图形学实验(全)
计算机图形学实验(全)

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

实验2圆与椭圆得绘制

实验目得

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

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

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

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

实验学时

2学时,必做实验。

实验内容

用中点(Besenham)算法实现椭圆或圆得绘制.

实验步骤

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

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

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

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

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

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

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

分析与思考

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

2.用中点算法生成得椭圆,为何在半径较大时,图形得失真严重?

实验代码:

圆:

#include<graphics、h〉

#include〈math、h〉

voidCirclePoint(intx,inty,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<=y){

?CirclePoint(x,y,color);

??if(d<0) d+=2*x+3;

?else{

??d+=2*(x-y)+5;

?y--;

?}

x++;

}

}

main()

{

int gdriver ,gmode ;

? gdriver = DETECT;

initgraph(&gdriver, &gmode ,"c:\\tc20\\bgi” );

MidBresenhamCircle(50,6);

getch();

? closegraph();

实验截图:

椭圆:

#include "graphics、h"

void MidBresenhamEllipse(int a,intb,intcolor){

int x,y;

?floatd1,d2;

x=0;y=b;

d1=b*b+a*a*(-b+0、5);

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

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

while(b*b*(x+1)<a*a*(y-0、5)){

?if(d1<=0){

d1+=b*b*(2*x+3);

x++;

else{

d1+=b*b*(2*x+3)+a*a*(-2*y+2);

x++;y--;

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

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

d2=b*b*(x+0、5)*(x+0、5)+a*a*(y-1)*(y—1)—a*a*b*b;

while(y>0){

?if(d2〈=0){

?d2+=b*b*(2*x+2)+a*a*(-2*y+3);

??x++; y--;

?else{

??d2+=a*a*(-2*y+3);

??y——;

?}

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

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

?}

main()

? int gdriver ,gmode ;

gdriver =DETECT;

initgraph(&gdriver,&gmode ,”c:\\tc20\\bgi" );

MidBresenhamEllipse(8,6,2);

getch ( );

closegraph();

实验截图:

实验3图形填充

实验目得

4、通过实验,进一步理解与掌握图形填充常用算法;

5、掌握以上算法进行填充图形得基本过程;

6、通过编程,会在TC环境下完成图形填充。

实验环境

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

实验学时

2学时,必做实验。

实验内容

任意画一个多边形,并用边填充算法进行填充.(多边形得顶点坐标存放在数组中,坐标值由键盘输入)

实验步骤

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

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

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

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

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

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

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

实验代码:

#include〈graphics、h>

#include

#include〈math、h>

#include〈conio、h>

#define MP 100

#include〈stdlib、h>

#define false0

void edge_mark(int arr[][2],int value,int polydeflen)

?int by,x,y,ax,ay;

int i,j;

?float k;

?by=arr[polydeflen—1][1];

?for (i=0;i〈polydeflen;i++)

{

?if (i == polydeflen-1)

?ax=arr[0][0];

?ay=arr[0][1];

?}

?else

?{

?ax=arr[i+1][0];

?ay=arr[i+1][1];

?}

?x=arr[i][0];

y=arr[i][1];

?if((y-ay)!=0)

k=(ax-x)/(float)(y—ay);

?if((y—by)*(ay-y)>=0)

??putpixel(x,y,value);

?getch();

?if(ay〈y)

??for(j=y-1;j>ay;j——)

?putpixel(x+(int)((y—j)*k),j,value);

?else for(j=y+1;j

??putpixel(x-(int)((j-y)*k),j,value);

by=y;

?}

}

void edge_mark_fill(int ar[][2],int value,int polydeflen) {

?int i,x,y,inside;

?int min,max;

?inside=false;

min=ar[0][1];max=ar[0][1];

edge_mark(ar,value,polydeflen);

for (i=1;i〈polydeflen;i++)

?{

?if(ar[i][1]>max)

?max=ar[i][1];

if(ar[i][1]〈min)

min=ar[i][1];

}

for (y=min;y<=max;y++)

?for(x=0;x<=640;x++)

{

?if (getpixel(x,y)==value)

??inside=!(inside);

?if (inside!=false)

??putpixel(x,y,value);

?else putpixel(x,y,0);

?}

?if(getch()==17)

exit(1);

?}

}

void main()

{

?char t[100];

int polydef[MP][2];

inti,j,gdriver,gmode,polydeflen,value;

?gdriver=DETECT;?

initgraph(&gdriver,&gmode,"c:\\tc20\\bgi");

?printf("please input the number of edges:\n");

scanf("%d",&polydeflen);

?printf("please inputthe color:\n”);

scanf("%d”,&value);

?printf("please inputthe (x,y):\n");

for (i=0;i<polydeflen;i++)?

??for (j=0;j<2;j++)

??scanf("%d”,&polydef[i][j]);

printf("please press thespacekey!”);

edge_mark_fill(polydef,value,polydeflen);

for(i=0;i<polydeflen;i++)?

?{

??sprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]);

outtextxy(polydef[i][0],polydef[i][1],t);

?}

?getch();

closegraph();

实验截图:

实验4 二维图形几何变换

实验目得

1、通过实验,进一步理解与掌握二维图形几何变换算法;

2、掌握以上算法进行二维图形几何变换基本过程;

3、通过编程,会在TC环境下完成二维图形几何变换过程。

实验环境

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

实验学时

2学时,必做实验。

实验内容

任意画一个平面图形,

(1)按比例缩小或放大、缩放比例由用户定义,缩放得参考点由用户确定; (2)旋转、由键盘输入旋转角度与旋转中心。

实验步骤

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

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

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

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

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

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

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

实验代码:

#include ”stdio、h”

#include "conio、h"

#include”graphics、h”

#include"math、h”

struct point

{

int x;

int y;

}triangle[3];

void ini()

{triangle[0]、x=30;

triangle[0]、y=30;

triangle[1]、x=30;

triangle[1]、y=120;

triangle[2]、x=120;

triangle[2]、y=70;

setcolor(RED);

line(triangle[0]、x,triangle[0]、y,triangle[1]、x,triangle[1]、y);

line(triangle[0]、x,triangle[0]、y,triangle[2]、x,triangle[2]、y);

line(triangle[1]、x,triangle[1]、y,triangle[2]、x,triangle[2]、y);

}

void zoom(floatsx,floatsy)

{

intxx[3];

int yy[3];

inti;

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

{

xx[i]=(triangle[i]、x-triangle[0]、x)*sx+triangle[0]、x;

yy[i]=(triangle[i]、y—triangle[0]、y)*sy+triangle[0]、y;

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

line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]);

getch();

setcolor(5);

for(i=0;i〈3;i++)

{

line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]);

}

void turn(int x,int y,int a)

{

int i;

int xx[3];

int yy[3];

for(i=0;i〈3;i++){

xx[i]=(triangle[i]、x-x)*cos(a)-(triangle[i]、y—y)*sin(a)+x;

yy[i]=(triangle[i]、x-x)*sin(a)+(triangle[i]、y—y)*cos(a)+y;

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

line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]);

getch();

setcolor(5);

for(i=0;i〈3;i++)

line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]);

void main()

{

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"c:\\tc20\\bgi");

ini();

getch();

?setcolor(0);

turn(120,70,-1);

ini();

?getch();

setcolor(0);

zoom(0、5,0、5);

ini();

?getch();

setcolor(0);

zoom(3,3);

?ini();

getch();

closegraph();

}

实验截图:

实验5 二维图形裁剪实验目得

1、通过实验,进一步理解与掌握二维图形裁剪常用算法;

2、掌握以上算法进行二维图形裁剪得基本过程;

3、通过编程,会在TC环境下完成二维图形裁剪过程。

实验环境

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

实验学时

2学时,必做实验。

实验内容

生成若干条直线段,由用户确定一个矩形裁剪窗口得位置与大小,保留窗口里得图形,抹去其余部分(使用Cohen-Sutherland算法)。

(完成作业得同学可以用line、setviewport函数再做该题)。

实验步骤

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

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

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

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

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

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

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

实验代码:

#include”graphics、h”

#include"stdio、h”

#include"math、h"

#define LEFT 1

#defineRIGHT2

#define BOTTOM 4

#defineTOP8

int x1=60,y1=60,x2=200,y2=200,x3=200,y3=300,xl=30,xr=100,yb=100,yt=20;

int encode(intx,int y,int*code)

int c;

c=0;

?if(x

c=LEFT;

else if(x〉xr)

c=RIGHT;

?if(y>yb)

c=BOTTOM;

?elseif(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,&code1);

encode(x2,y2,&code2);

encode(x3,y3,&code3);

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

if(code1&code2!=0)

return;

code=code1;

if(code1==0)

code=code2;

if((LEFT&code)!=0)

{

?x=x1;

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

}

else if((RIGHT&code)!=0)

x=xr;

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

}

elseif((BOTTOM&code)!=0)

{

y=yb;

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

else if((TOP&code)!=0)

y=yt;

x=x1+(long)(x2-x1)*(yt—y1)/(y2—y1);

}

if(code==code1)

{x1=x;

y1=y;

encode(x,y,&code1);

else

{x2=x;

y2=y;

encode(x,y,&code2);

}

}

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

{

if(code1&code3!=0)

return;

code=code1;

if(code1==0)

code=code3;

if((LEFT&code)!=0)

x=x1;

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

}

else if((RIGHT&code)!=0)

{

x=xr;

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

else if((BOTTOM&code)!=0)

y=yb;

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

else if((TOP&code)!=0)

y=yt;

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

if(code==code1)

{x1=x;

y1=y;

encode(x,y,&code1);

else

{x3=x;

y3=y;

encode(x,y,&code3);

}

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

{

if(code3&code2!=0)

return;

code=code3;

if(code3==0)

code=code2;

if((LEFT&code)!=0)

x=x3;

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

else if((RIGHT&code)!=0)

x=xr;

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

}

else if((BOTTOM&code)!=0)

{

y=yb;

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

else if((TOP&code)!=0)

{

y=yt;

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

if(code==code3)

{x1=x;

y1=y;

encode(x,y,&code3);

else

{x2=x;

y2=y;

encode(x,y,&code2);

}

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(&graphdriver,&graphmode,"C:\\TC20\\BGI");

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"

#defineMULTIPLE 7

#define ROW4

struct node{

float x,y;

};

voiddraw_polygon(structnode a[],int originx,int originy){

intn;

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 nodedecasteljau(structnode p[],intn,float u)

int i,r;

struct node point,q[20];

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

q[i]=p[i];

for(r=1;r〈n;r++)

for(i=0;i<n-r;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,intx0,int y0)

inti,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(&gdriver,&gmode,"”);

originx=getmaxx()/2;

originy=getmaxy()/2;

setcolor(BLUE);

draw_polygon(a,originx,originy);

setcolor(RED);

draw_bezier_curve(a,ROW,originx,originy);

getch();

closegraph();

实验截图:

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 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对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验--橡皮筋技术(完整代码,准确无误)

计算机图形学上机实验报告 橡皮筋技术 计算机科学与技术学院 姓名: xxx 完成日期: 2010-12-7

实验:橡皮筋技术 一、实验目的与要求 实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法, 2.理解glut程序框架 3.理解窗口到视区的变换 4.理解OpenGL实现动画的原理 5.学会基于鼠标和键盘实现交互的实现方法 二、实验内容: 利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择 实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。 2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。 2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。 3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。 三、实验结果

图鼠标右键菜单 图绘制矩形 四、体会 1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础. 2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键 盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。在这个过 程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和 老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论 知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到 理论与实践的结合的重要性,今后要多多提高提高动手能力。

计算机图形学实验报告

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

计算机图形学实验报告

目录

实验一直线的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); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学实验三报告

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

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

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

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

计算机图形学实验

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

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

计算机图形学 实验一:生成彩色立方体(含源代码)

实验一 实验目的:生成彩色立方体 实验代码://ColorCube1.java import java.applet.Applet; //可以插入html import java.awt.BorderLayout; //窗口采用BorderLayout方式布局import com.sun.j3d.utils.applet.MainFrame; //application import com.sun.j3d.utils.geometry.ColorCube;//调用生成ColorCube的Utility import com.sun.j3d.utils.geometry.Primitive; import com.sun.j3d.utils.universe.*; //观测位置的设置 import javax.media.j3d.*; //核心类 import javax.vecmath.*; //矢量计算 import com.sun.j3d.utils.behaviors.mouse.*; public class ColorCube1 extends Applet { public BranchGroup createSceneGraph() { BranchGroup objRoot=new BranchGroup(); //BranchGroup的一个对象objRoot(放置背景、灯光)BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);//有效范围 TransformGroup objTrans=new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); objRoot.addChild(objTrans); MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objRoot.addChild(behavior); behavior.setSchedulingBounds(bounds); MouseZoom behavior2 = new MouseZoom(); behavior2.setTransformGroup(objTrans); objRoot.addChild(behavior2); behavior2.setSchedulingBounds(bounds); MouseTranslate behavior3 = new MouseTranslate(); behavior3.setTransformGroup(objTrans); objRoot.addChild(behavior3); behavior3.setSchedulingBounds(bounds);

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

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

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

计算机图形学课程教学大纲

《计算机图形学》课程教学大纲一、课程基本信息 课程代码:110053 课程名称:计算机图形学 英文名称:Computer Graphics 课程类别:专业课 学时:72 学分: 适用对象:信息与计算科学专业本科生 考核方式:考试(平时成绩占总成绩的30%) 先修课程:高级语言程序设计、数据结构、高等代数 二、课程简介 中文简介: 计算机图形学是研究计算机生成、处理和显示图形的学科。它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据已经成为信息领域的一个重要发展趋势。通过本课程的学习,使学生掌握计算机图形学的基本原理和基本方法,理解图形绘制的基本算法,学会初步图形程序设计。 英文简介: Computer Graphics is the subject which concerned with how computer builds, processes and shows graphics. Its importance has been shown in people’s more and more intensively need for harmony human-machine interface. Graphics user interface has become an important part of software. It is a significant trend to show abstract conception or data in graphics way. Through the learning of this course, students could master Computer Graphics’basic theories and methods,understand graphics basic algorithms and learn how to design basic graphics program. 三、课程性质与教学目的 《计算机图形学》是信息与计算科学专业的一门主要专业课。通过本课程的学习,使学生掌握基本的二、三维的图形的计算机绘制方法,理解光栅图形生成基本算法、几何造型技术、真实感图形生成、图形标准与图形变换等概念和知识。学会图形程序设计的基本方法,为图形算法的设计、图形软件的开发打下基础。 四、教学内容及要求 第一章绪论 (一)目的与要求 1.掌握计算机图形学的基本概念; 2.了解计算机图形学的发展、应用; 3.掌握图形系统的组成。

计算机图形学实验报告

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

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

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

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

计算机图形学实验--完整版-带结果--vc++实现

计算机图形学实验报告信息学院计算机专业20081060183 周建明 综括: 利用计算机编程语言绘制图形,主要实现以下内容: (1)、中点算法生成任意斜率直线,并设置线型线宽。 (2)、中点算法生成圆 (3)、中点算法生成椭圆 (4)、扫描算法实现任意多边形填充 (5)、Cohen_Sutherland裁剪 (6)、自由曲线与曲面的绘制 (7)、二维图形变换 (8)、三视图变换 实验一、直线的生成 一、实验内容 根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。 二、算法原理介绍 双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。打开直线生成view.cpp,按注释改写下列函数: 1.void CMyView::OnDdaline() (此为DDA生成直线) 2.void CMyView::OnBresenhamline()(此为Bresenham画直线) 3.void CMYView::OnMidPointLine()(此为中点画线法) 三、程序源代码 1.DDA生成直线画法程序: float x,y,dx,dy,k; dx=(float)(xb-xa); dy=(float)(yb-ya); k=dy/dx; x=xa; y=ya;

if(abs(k)<1) { for (x=xa;x<=xb;x++) { pdc->SetPixel(x, int(y+0.5),COLOR); y=y+k; } } if(abs(k)>=1) { for(y=ya;y<=yb;y++) { pdc->SetPixel(int(x+0.5),y,COLOR); x=x+1/k; } } //DDA画直线结束 } 2.Bresenham画直线源程序: float b,d,xi,yi; int i; float k; k=(yb-ya)/(xb-xa); b=(ya*xb-yb*xa)/(xb-xa); if(k>0&&k<=1) for(i=0;i=0) { xi=xa+1; yi=ya; xa++; ya=ya+0.5; } if(d<0) { xi=xa+1; yi=ya+1; xa++; ya=ya+1.5; } pdc->SetPixel(xi,yi,COLOR); }

计算机图形学实验报告

实验一 3D模型的加载、渲染与三维操作 学院: 专业班级: 指导老师: 学号: 姓名: 完成日期:

目录 一、实验目的 (3) 二、使用的工具软件及环境 (3) 三、实验内容 (3) 四、实验步骤 (3) 五、思考 (12)

一、实验目的 1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT和GLUI; 2、了解计算机图形学固定流水线; 3、了解OpenGL编程基础; 4、掌握三维观察的数学表达和程序实现; 5、掌握多边形网格的绘制; 二、使用的工具软件及环境 Microsoft Visual Studio 2010、OpenGL、Glut、Glui 三、实验内容 1、在VS 2010中配置OpenGL环境; 2、编译简单的GLUT程序; 3、编译GLUI源代码,并在调试模式下执行6个示例程序; 4、在给定的工程中添加绘制简单几何体的代码; 5、在给定的工程中添加读取、绘制三维模型的代码; 6、在给定的工程中添加旋转、平移和缩放的控制代码; 四、实验步骤 1、安装Microsoft Visual Studio软件 版本选择:Microsoft Visual Studio 2010以上版本 2、VS2010中配置GLUT 1)下载GLUT。Windows环境下的GLUT下载地址: https://www.sodocs.net/doc/a53103502.html,/resources/libraries/glut/glutdlls37beta.zip 2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、 glut.dll、glut32.dll。3)将glut.h放到"%WinDir%\Program Files(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。 4)将glut.lib和glut32.lib放到"%WinDir%\Program Files(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。 5)将glut.dll和glut32.dll放到"%WinDir%\system32"文件夹(32位操作 系统)或者"%WinDir%\SysWOW64"文件夹(64位操作系统)。 3、测试GLUT配置环境

相关主题