计算机图形学实验全.docx
《计算机图形学实验全.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验全.docx(8页珍藏版)》请在冰豆网上搜索。
计算机图形学实验全
计算机图形学实验(全)
实验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:
#includeabs(dy))
epsl=abs(dx);
else
epsl=abs(dy);
xIncre=(float)dx/(float)epsl;
yIncre=(float)dy/(float)epsl;
for(k=0;k
#include
voidBresenhamLine(intx0,inty0,intx1,inty1,intcolor){
intx,y,dx,dy,e;
dx=x1-x0;
dy=y1-y0;
e=-dx;x=x0;y=y0;
while(x0){
y++;
e=e-2*dx;
}
}
}
main(){
intgdriver,gmode;
gdriver=DETECT;
initgraph(
BresenhamLine(0,0,120,200,5);
getch();
closegraph();
}
实验2圆和椭圆的绘制
实验目的
1、通过实验,进一步理解和掌握中点算法;
2、掌握以上算法生成椭圆或圆的基本过程;
3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。
实验环境
计算机、TurboC或其他C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
用中点(Besenham)算法实现椭圆或圆的绘制。
实验步骤
1.算法、原理清晰,有详细的设计步骤;
2.依据算法、步骤或程序流程图,用C语言编写源程序;
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
分析与思考
1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?
2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?
实验代码:
圆:
#include
#include
voidCirclePoint(intx,inty,intcolor)
{
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);
}
voidMidBresenhamCircle(intr,intcolor)
{
intx,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;
elseif(yc=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){
intx,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);
}
elseif((RIGHT
y=y1+(long)(y2-y1)*(xr-x1/x2-x1);
}
elseif((BOTTOM
x=x1+(long)(x2-x1)*(yb-y1)/(y2-y1);
}
elseif((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);
}
elseif((RIGHT
y=y1+(long)(y3-y1)*(xr-x1/x3-x1);
}
elseif((BOTTOM
x=x1+(long)(x3-x1)*(yb-y1)/(y3-y1);
}
elseif((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);
}
elseif((RIGHT
y=y1+(long)(y2-y3)*(xr-x3/x2-x3);
}
elseif((BOTTOM
x=x1+(long)(x2-x1)*(yb-y3)/(y2-y3);
}
elseif((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;
}
voidmain()
{
intgraphdriver=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曲线的生成算法。
实验环境
计算机、TurboC或其他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"
#defineMULTIPLE7
#defineROW4
structnode{
floatx,y;
};
voiddraw_polygon(structnodea[],intoriginx,intoriginy)
{
intn;
for(n=0;nif(n==0)moveto(originx+a[0].x,originy-a[0].y);
lineto(originx+a[n].x,originy-a[n].y);
}
}
structnodedecasteljau(structnodep[],intn,floatu)
{
inti,r;
structnodepoint,q[20];
for(i=0;iq[i]=p[i];
for(r=1;rfor(i=0;iq[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;
}
returnq[0];
}
voiddraw_bezier_curve(structnodep[],intn,intx0,inty0){
inti,x,y;
floatu,delta;
structnodepoint;
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()
{
intgdriver=DETECT,gmode;
intnumber,n,originx,originy;
structnodea[]={{120,0},{45,0},{0,45},{0,120}};
initgraph(
originx=getmaxx()/2;
originy=getmaxy()/2;
setcolor(BLUE);
draw_polygon(a,originx,originy);
setcolor(RED);
draw_bezier_curve(a,ROW,originx,originy);
getch();
closegraph();}
实验截图:
|