当前位置:文档之家› 计算机图形学实验--完整版-带结果--vc++实现

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

计算机图形学实验--完整版-带结果--vc++实现
计算机图形学实验--完整版-带结果--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

{ d=ya+0.5-k*(xa+1)-b;

if(d>=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);

}

//BresenHam画直线结束}

3.中点画线法源程序:

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

{ d=ya+0.5-k*(xa+1)-b;

if(d>=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); }

//BresenHam画直线结束}

四、实验结果

1、DDA生成直线

2、Bresenham画直线

3、中点画线法

实验二、bresenham画圆

一、实验内容

根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。

二、算法原理介绍

双击experiment.dsw打开,或者先启动VC++,文件(file)→打开工作空间(open workspace)。打开直线生成view.cpp,按注释改写下列函数:

void CMyView::OnBresenhamCircle()

三、程序源代码

bresenham画圆源程序

void Bresenhan_circle()

;int x,y=180,color=1,xcenter,ycenter;x=0;

int d=3-2*180;

while(x

{

if(d<0){d=d+4*x+6;x=x+1;}

else{d=d+4*(x-y)+10;x=x+1;y=y-1;}

pdc->SetPixel(0+x,0+y,COLOR);

pdc->SetPixel(0+x,0-y,COLOR);

pdc->SetPixel(0-x,0+y,COLOR);

pdc->SetPixel(0-x,0-y,COLOR);

pdc->SetPixel(0+y,0+x,COLOR);

pdc->SetPixel(0+y,0-x,COLOR);

pdc->SetPixel(0-y,0+x,COLOR);

pdc->SetPixel(0-y,0-x,COLOR);

}

四、实验结果

实验三、二维图形的几何变换

一、实验内容

以一条直线段为例,完成目标的平移、绕任一点旋转。(缩放等其它变换选做)

二、实验步骤和方法

1、打开二维变换.dsw

2、改写二维变换view.cpp里的void CMyView::Onrecycle()函数(需要改写的地

方我已经做了说明)。

3、生成直线的函数采用VC里的函数。

4、函数的主要任务是计算出变换后的坐标。

三、程序源代码

1.目标的平移的源程序

xa1=xa+dx;

ya1=ya+dy;

xb1=xb+dx;

yb1=yb+dy;

2.绕任意点旋转的源程序

xa1=cos(angle/57.1)*xa-sin(angle/57.1)*ya+x-x*cos(angle/57.1)+y*sin(angle/57.1);y a1=sin(angle/57.1)*xa+cos(angle/57.1)*ya+y-y*cos(angle/57.1)-x*sin(angle/57.1); xb1=cos(angle/57.1)*xb-sin(angle/57.1)*yb+x-x*cos(angle/57.1)+y*sin(angle/57.1);y b1=sin(angle/57.1)*xb+cos(angle/57.1)*yb+y-y*cos(angle/57.1)-x*sin(angle/57.1);

四、实验结果

1、目标的平移的源程序

2、绕任意点旋转的源程序

实验四、用扫描线算法实现多边形填充:

(1)算法思想:

用水平扫描线从上到下扫描由点线段构成的多段定义的多边形。每根扫描线与多边形各边产生一系列交点,将这些交点按照x坐标进行排序,将排序后的交点成对取出,作为两个端点,用所需填充的色彩画水平直线。多边形被扫描完毕,则填充结束。

实现步骤:

(1)建立边的分类表ET;

(2)将扫描线纵坐标y的初值为ET中非空元素的最小序号;

(3)置活化边表AEL为空;

(4)执行下列步骤直至ET和AEL都为空;

A、如果ET中的第y类非空,则将其中的所有边取出并插入AEL中,在插入过程忠进行排序;

B、对AEL中的边两两配对,将每对边中x坐标按规则取整,获得有效的填充区段,再填充;

C、将当前扫描线纵坐标y值递增1,即y=1;

D、将AEL中满足y=ymax边删去;

E、对AEL中剩下的每一条边的x递增deltax,即x=x+deltax;

(2)程序实现

typedef struct

{

int y_top;

float x_int;

int delta_y;

float x_change_per_scan; }EACH_ENTRY;

EACH_ENTRY sides[MAX_POINT];

int x[MAX_POINT],y[MAX_POINT];

int side_count,first_s,last_s,scan,bottomscan,x_int_count;

void fill_area(int count)

{

sort_on_bigger_y(count); first_s=1; last_s=1;

for(scan=sides[1].y_top;scan>=bottomscan;scan--)

{ update_first_and_last(count,scan);

process_x_intersections(first_s,last_s);

draw_lines(scan,x_int_count,first_s);

update_sides_list(); } }

sort_on_bigger_y(int n)

{ int k,x1,y1;int tem;

side_count=0; y1=y[n];

x1=x[n]; bottomscan=y[n];

for(k=1;k

{ if(y1!=y[k])

{ side_count++; if(k!=n) tem=y[k+1];

else tem=y[1];

put_in_sides_list(side_count,x1,y1,x[k],y[k],tem);

}

else { setcolor(13); line(x1,y1,x[k],y[k]); }

if(y[k]

y1=y[k];x1=x[k]; }

}

put_in_sides_list(int entry,int x1,int y1,int x2,int y2,int next_y) { int maxy; float x2_temp,x_change_temp;

x_change_temp=(float)(x2-x1)/(float)(y2-y1);

x2_temp=x2; if((y2>y1)&&(y2

{ y2--; x2_temp-=x_change_temp; }

else { if((y2next_y))

{ y2++; x2_temp+=x_change_temp; } }

maxy=(y1>y2)? y1:y2;

while((entry>1)&&(maxy>sides[entry-1].y_top))

{ sides[entry]=sides[entry-1];

entry--; }

sides[entry].y_top=maxy;

sides[entry].delta_y=abs(y2-y1)+1;

if(y1>y2) sides[entry].x_int=x1;

else sides[entry].x_int=x2_temp;

sides[entry].x_change_per_scan=x_change_temp;

}

update_first_and_last(int count,int scan)

{

while((sides[last_s+1].y_top>=scan)&&(last_s

last_s++; while(sides[first_s].delta_y==0)

first_s++; }

process_x_intersections(int first_s,int last_s)

{ int k; x_int_count=0;

for(k=first_s;k

{ if(sides[k].delta_y>0)

{ x_int_count++;

sort_on_x(k,first_s);

}

}

}

sort_on_x(int entry,int first_s)

{ while((entry>first_s)&&(sides[entry].x_int

}

}

swap(EACH_ENTRY *x,EACH_ENTRY *y)

{ int i_temp;

float f_temp;

i_temp=x->y_top;

x->y_top=y->y_top;

y->y_top=i_temp;

f_temp=x->x_int;

x->x_int=y->x_int;y->x_int=f_temp;

i_temp=x->delta_y;x->delta_y=y->delta_y;

y->delta_y=i_temp;

f_temp=x->x_change_per_scan;

x->x_change_per_scan=y->x_change_per_scan;

y->x_change_per_scan=f_temp;

}

draw_lines(int scan,int x_int_count,int index)

{

int k,x,x1,x2; for(k=1;k<(int)(x_int_count/2+1.5);k++) { while(sides[index].delta_y==0)

index++; x1=(int)(sides[index].x_int+0.5);

index++;

while(sides[index].delta_y==0)

index++;

x2=(int)(sides[index].x_int+0.5);

setcolor(13);

line(x1,scan,x2,scan); index++;

}

}

update_sides_list() {

int k;

int temp;

for(k=first_s;k

{ if(sides[k].delta_y>0)

{ sides[k].delta_y--;

sides[k].x_int-=sides[k].x_change_per_scan;

}

}

}

实验五

用Cohen-Sutherland裁剪算法实现直线段

裁剪:

5.1编码算法:

5.1.1算法思想:

本算法分为三个步骤:判断线段两端是否都在窗口内,如果是,线段完全可见;否则判断线段是否显然不可见,如果是,裁剪结束。否则求线段与窗口边延长线的交点,此线段将线段分为两段,其中一段不可见,舍弃。对余下的线段继续进行递归裁剪。算法的编码是进行二进制位运算,若顶点在窗口内,则二进制编码为0000;否则进行编码。

5.1.2实现步骤:

(1)这种算法利用编码的方法,延长窗口边线,使得它们把包含未经裁剪图形的窗口平面区域分成九个区域:

(2)每个区域用一个4位编码CtCbCrCl来表示,代码中每一位分别是0或1,是按照窗口边线来确定的,下面给出具体的编码规则,其中最右边的位Cl是第一位,依次Cr第二、Cb第三、Ct第四位。

A、当两端点P1(x1,y1)和P2(x2,y2)在区域0000中,即满足点的裁剪不等式:

B、当两个端点在窗口边线外的同侧位置,则他们的四位代码中,有一相同位,同时位“1”,显然两个端点代码C1和C2按位与运算C1&C2≠0 .由此可检查判断直线在窗口外,应全部舍弃。

C、果直线两端点不满足上述两种情况,不能简单地全部保留或全部舍弃直线时,则需要计算出直线与窗口边线的交点,将直线分段后继续进行检查判断。这样可以逐段地舍弃位于窗口外地线段,保留剩余在窗口内的线段。

5.1.3程序实现

/*********定义裁剪函数************/

void line_c lip(int x1, int y1, int x2, int y2, int left,int top,int right, int bottom)

{

void getcode(int x,int y,int d[4]); /*定义获得端点的代码函数*/

int i,x11,y11; /*定义交点坐标*/

int aa=1;

getcode(x1,y1,a);

getcode(x2,y2,b);

/*1:裁剪循环开始*/

while(aa!=0)

{

if((a[0]+a[1]+a[2]+a[3]==0)&&(b[0]+b[1]+b[2]+b[3]==0)) /*第一种情况线段完全可见*/

{

aa=0;

return;

}

else if((a[0]&&b[0])+(a[1]&&b[1])+(a[2]&&b[2])+(a[3]&&b[3])!=0) /*线段完全不可见*/ {

setcolor(0);

setwritemode(0); /*设置画线的输出模式为覆盖方式*/

line(x1,y1,x2,y2); /*进行裁剪也就是进行覆盖*/

aa=0;

return;

}

/*2:线段即不完全可见,也不完全不可见,即与边有交点的线段的裁剪处理*/

else

{

if(a[0]+a[1]+a[2]+a[3]==0) /*寻找不可见点*/

{

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

c[i]=b[i];/*x2,y2为不可见点*/

}

else

{

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

c[i]=a[i];/*x1,y1为不可见点*/

}

/*3:直线与窗口边作求交运算,求出交点赋值给x11、y11*/

if(c[0]==1)

{

x11=left;

y11=(int)((y2-y1)*(left-x1)/(x2-x1)+y1);

}

else if(c[1]==1)

{

x11=right;

y11=(int)((y2-y1)*(right-x1)/(x2-x1)+y1);

}

else if(c[2]==1)

{

x11=(int)((x2-x1)*(bottom-y1)/(y2-y1)+x1);

y11=bottom;

}

else if(c[3]==1)

{

x11=(int)((x2-x1)*(top-y1)/(y2-y1)+x1);

y11=top;

} /*3:求交运算结束*/

if((c[0]==a[0])&&(c[1]==a[1])&&(c[2]==a[2])&&(c[3]==a[3]))

{

setcolor(0);

setlinestyle(0,0,3);

setwritemode(0);

line(x1,y1,x11,y11);

x1=x11; y1=y11;

getcode(x11,y11,a);

}

else if((c[0]==b[0])&&(c[1]==b[1])&&(c[2]==b[2])&&(c[3]==b[3])) {

setcolor(0);

setlinestyle(0,0,3);

setwritemode(0);

line(x2,y2,x11,y11);

x2=x11;y2=y11;

getcode(x11,y11,b);

}

} /*2:与边有交点的线段裁剪处理结束*/

} /*1:裁剪循环结束*/

}

/*获得端点代码*/

void getcode(int x,int y,int d[4])

{

d[0]=0;d[1]=0;d[2]=0;d[3]=0;

if(x

if(x>right) d[1]=1;

if(y>bottom) d[2]=1;

if(y

return;

}

实验六自由曲线与曲面的绘制

6.1、生成Bezier曲线

(1)算法思想

利用Bezier曲线造型时,如果其次数太高,固然能表示复杂的形状,但同时造成计算复杂度增加,而二次Bezier曲线表示能力有限,故下面我们仅讨论三次Bezier曲线的矩阵表示和计算机生成。

(1) 矩阵表示

三次Bezier曲线的定义式为:

将其分解为两个矢量的点积为:

取Bezier曲线的几何矩阵,则有:

得到三次Bezier曲线的基矩阵为:

(2) 三次Bezier曲线的生成

Bezier曲线用的参数表示法,因此将区间[0,1]分成N等份,确定了控制点后,每取一个都对应一个三维的点。这样,在每两个和之间画一条直线,再将该这些直线段投影到二维平面,就可以得到我们需要的Bezier曲线了。

(2)程序实现:

void bezier_3(int color, double p[4][2])

{

double t,t1,t2,xt,yt;

int rate=200,x,y;

setcolor(color);

moveto(p[0][0],p[0][1]);

for (t=0;t<=1;t+=1.0/rate)

{

yt=1-t;

t1=yt*yt;

t2=3*yt*t;

xt=p[0][0]*t1*yt+p[1][0]*t2*yt+p[2][0]*t2*t+p[3][0]*t*t*t;

yt=p[0][1]*yt*t1+p[1][1]*t2*yt+p[2][1]*t2*t+p[3][1]*t*t*t;

x=(int)(xt);

y=(int)(yt);

lineto(x,y);

}

}

6.2绘制Bezier曲面

(1)算法思想:

Bezier曲线是一条与控制多边形顶点位置有严格关系的曲线,Bezier曲线形状趋向于特征多边形的形状,而且阶数由控制多边形顶点的个数决定。Bezier曲面则是由Bezier曲线拓广而来,它也是以Bernstein函数作为基函数,是由Bernstein基函数构造空间点阵列的位置来控制的。

(2)算法实现步骤:

1.给出控制顶点。

2.根据如下公式,编程绘制Bezier曲面。

计算各点坐标

3. 用画直线的方法首尾相接的画直线。

(3)、程序实现:

main()

{

char str[80];

int driver,mode;

int i,k,m,j;

int x0=300,y0=300;

int p[4][4][3]={{{12,145,50},{24,120,50},{45,117,50},{65,140,50}},

{{24,65,34},{56,45,34},{87,56,34},{99,75,34}},

{{43,120,20},{65,98,20},{87,100,20},{111,115,20}},

{{15,160,0},{34,120,0},{55,135,0},{75,170,0}}};

float u0,u1,u2,u3,v0,v1,v2,v3;

float q10,q11,q12,q13,du,dv;

float q[n+1][n+1][3],q20[3],q21[3],q22[3],q23[3],q30[3],q31[3],q32[3],q33[3];

float x,y;

printf("input j:(0---bezier, 1---B_spline)\n");

scanf("%d",&j);

driver=DETECT;mode=0;

initgraph(&driver,&mode,"D:\\TC");

setbkcolor(1);

setcolor(15);

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

{for(k=0;k<=3;k++)

{x=(-0.7071*p[i][k][0]+0.7071*p[i][k][1]+200)*2-300;

y=(0.4082*p[i][k][0]+0.4082*p[i][k][1]-0.8165*p[i][k][2]+200)*2-300;

if(k==0)moveto(x,y);lineto(x,y);

}

}

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

{for(k=0;k<=3;k++)

{x=(-0.7071*p[k][i][0]+0.7071*p[k][i][1]+200)*2-300;

y=(0.4082*p[k][i][0]+0.4082*p[k][i][1]-0.8165*p[k][i][2]+200)*2-300;

if(k==0)moveto(x,y);lineto(x,y);

}

}

du=dv=1.0/n;

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

{

u0=(i*du)*(i*du)*(i*du);u1=(i*du)*(i*du);u2=i*du;u3=1;

if(j==0)

{q10=u0*(-1)+u1*3+u2*(-3)+u3*1;q11=u0*3+u1*(-6)+u2*3;

q12=u0*(-3)+u1*3;q13=u0*1;}

if(j==1)

{q10=(u0*(-1)+u1*3+u2*(-3)+u3*1)/6; q11=(u0*3+u1*(-6)+u3*4)/6;

q12=(u0*(-3)+u1*3+u2*3+u3*1)/6;q13=(u0*1)/6;}

for(k=0;k<=2;k++)

{

q20[k]=q10*p[0][0][k]+q11*p[1][0][k]+q12*p[2][0][k]+q13*p[3][0][k]; q21[k]=q10*p[0][1][k]+q11*p[1][1][k]+q12*p[2][1][k]+q13*p[3][1][k]; q22[k]=q10*p[0][2][k]+q11*p[1][2][k]+q12*p[2][2][k]+q13*p[3][2][k]; q23[k]=q10*p[0][3][k]+q11*p[1][3][k]+q12*p[2][3][k]+q13*p[3][3][k]; if(j==0)

{q30[k]=q20[k]*(-1)+q21[k]*3+q22[k]*(-3)+q23[k]*1;

q31[k]=q20[k]*3+q21[k]*(-6)+q22[k]*3;

q32[k]=q20[k]*(-3)+q21[k]*3;

q33[k]=q20[k]*1;}

if(j==1)

{q30[k]=(q20[k]*(-1)+q21[k]*3+q22[k]*(-3)+q23[k]*1)/6;

q31[k]=(q20[k]*3+q21[k]*(-6)+q22[k]*3)/6;

q32[k]=(q20[k]*(-3)+q22[k]*3)/6;

q33[k]=(q20[k]*1+q21[k]*4+q22[k]*1)/6;}

}

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

{

v0=(m*dv)*(m*dv)*(m*dv);v1=(m*dv)*(m*dv);v2=m*dv;v3=1;

for(k=0;k<=2;k++)

{q[i][m][k]=q30[k]*v0+q31[k]*v1+q32[k]*v2+q33[k]*v3;}

}

}

setcolor(4);

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

{for(m=0;m<=n;m++)

{x=(-0.7071*q[i][m][0]+0.7071*q[i][m][1]+200)*2-300;

y=(0.4082*q[i][m][0]+0.4082*q[i][m][1]-0.8165*q[i][m][2]+200)*2-300;

if(m==0)moveto(x,y);

lineto(x,y);

}

}

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

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

{x=(-0.7071*q[i][m][0]+0.7071*q[i][m][1]+200)*2-300;

y=(0.4082*q[i][m][0]+0.4082*q[i][m][1]-0.8165*q[i][m][2]+200)*2-300;

if(m==0)moveto(x,y);

lineto(x,y);

}

}

if(j==0)

{ printf("3Bezier curved surface");}

if(j==1)

{ printf("3B_Splline curved surface");}

outtextxy(270,270,"this is zhouman's homework");

setcolor(3);

settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);

sprintf(str,"%s","----graphics:zhouman--time:2009.12.30----");

outtextxy(120,430,str);

getch();

closegraph();

}

实验七二维图形的缩放、旋转,平移,组

合变换

(1)思想算法:

在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:

平移变换:[x* y* 1] =[x y 1] * =[t*x s*y 1]

比例变换:[x* y* 1]=[x y 1] * =[m+x n+y 1]

旋转变换:在平面上的二维图形饶原点逆时针旋转?角,变换矩阵为

[x* y* 1]=[x y 1] * = [x*cos?-y*sin?]

复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时

候,我们就要用到复合变换矩阵。

(2)、程序实现:

用直线命令画出一个齿(或六边形的一半)→利用旋转变换或对称变换矩阵实现对其余部分的绘制→调试运行程序→输出图形→分析结果→结束。

void tf1(float sq,float cq,int xp,int yp)

{ t[0][0]=cq; t[0][1]=sq; t[0][2]=0;

t[1][0]=-sq;t[1][1]=cq; t[1][2]=0;

t[2][0]=xp; t[2][1]=yp; t[2][2]=1;

}

void tf2()

{ float x,y;

x=pp[j][0];y=pp[j][1];

pp[j][0]=x*t[0][0]+y*t[1][0]+t[2][0];

pp[j][1]=x*t[0][1]+y*t[1][1]+t[2][1];

}

main()

{

int gdriver,gmode,xp=300,yp=200;

float p[][2]={{80,1},{80,8},{99,17},{97,26},{76,26}};

float i,t[3][3];

gdriver=DETECT;

registerbgidriver(EGA VGA_driver);

initgraph(&gdriver,&gmode,"d:\\tc");

setbkcolor(3);

cleardevice();

setcolor(9);

circle(xp,yp,70);

circle(xp,yp,20);

circle(xp,yp,40);

circle(xp,yp,5);

circle(xp,yp,2);

circle(xp,yp,45);

setlinestyle(0,0,6);

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

{tf1(sin(i),cos(i),xp,yp);

for(j=0;j<5;j++)

{pp[j][0]=p[j][0];pp[j][1]=p[j][1];tf2();}

for(j=0;j<4;j++)

line(pp[j][0],pp[j][1],pp[j+1][0],pp[j+1][1]);

delay(10000);

}

getch();

closegraph();

}

8.图形三视图变换

编写三维变换算法程序→检查程序的正确性→分段调试程序→输入给出的三维形体各顶点的坐标→执行变换→对算法程序进行必要的调整→更换不同的形体数据继续变换→结束。程序实现:

#include

#include

int a[14][4]={{30,0,0,1},{30,40,0,1},{0,40,0,1},{0,40,10,1},{0,30,30,1},

{0,0,30,1},{30,0,30,1},{30,10,30,1},{10,10,30,1},{10,30,30,1},{10,40,10,1},

{10,10,10,1},{30,10,10,1},{30,40,10,1}};

float t[4][4],p[14][4];

void a400()

{int i,j;

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

for(j=0;j<4;j++)

t[i][j]=0;

}

void a500()

{ int k,i,j;

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

{for(j=0;j<4;j++)

{p[i][j]=0;

for(k=0;k<4;k++)

p[i][j]=p[i][j]+a[i][k]*t[k][j];}

p[i][0]=p[i][0]+280;

p[i][1]=-p[i][1]+180;

}

setcolor(9);

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

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (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

计算机图形学实验报告

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

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 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对话框中,接受默认选项,单击“下一个”按钮。

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

计算机图形学实验报告,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); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学实验指导书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、掌握中点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. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 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);

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科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;

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

计算机图形学实验报告

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

计算机图形学实验

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

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

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

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

大学实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科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

计算机图形学实验报告

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

计算机图形学实验指导书

计算机图形学实验指导书 授课教师:臧辉 适用专业:计算机学院计算机科学技术 使用班级: 12软件工程 授课时间:2015春季 授课学时:40/30/10学时 使用教材:计算机图形学教程 王汝传编著 人民邮电出版社,2009年版 湖北理工学院计算机学院

实验教学进度表

实验一直线段的生成算法 一、实验目的及要求 1、掌握Bresenham算法的原理; 2、熟悉Bresenham算法的具体c语言实现; 3、掌握dda算法的原理; 4、熟悉dda算法的具体c语言实现。 二、实验学时 4学时 三、实验任务 1、Bresenham算法的c语言实现 2、DDA算法的c语言实现 四、实验重点、难点 对Bresenham算法的原理以及c语言程序的具体实现 (一)Bresenham算法的实现 #include #include #include #include void Bresenham_line(int x0,int y0,int x1,int y1,int color) { 具体代码根据书上算法2.1.6改写 } Void main() { int gdriver = DETECT, gmode, errorcode; char msg[80]; initgraph(&gdriver, &gmode, "");//初始化图形和局部变量Bresenham_line(100,100,300,300,5); Getch(); Closegraph(); } (二)DDA算法的实现 #include #include #include #include void DDAline(int x0,int y0,int x1,int y1,int color) { 根据书上算法2.1-2改写 } void main() { int gdriver = DETECT, gmode;

计算机图形学实验报告

实验一 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.doczj.com/doc/3b6693291.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配置环境

相关主题
文本预览
相关文档 最新文档