计算机图形学.docx
《计算机图形学.docx》由会员分享,可在线阅读,更多相关《计算机图形学.docx(13页珍藏版)》请在冰点文库上搜索。
计算机图形学
//计科2班李成斌2009118313图形学期中考试
#include
#include
#include
#include
#defineROUND(a)((int)(a+0.5))
voidlineDDA(intx1,inty1,intx2,inty2,intcolor)//DDA画直线intROUND(floata){return(int)(a+0.5);}
{
inti;
floatx,y,k;
k=(float)(y2-y1)/(x2-x1);
x=(float)x1,y=(float)y1;
if(k<=1)
for(i=x1;i<=x2;i++)
{putpixel(ROUND(x),ROUND(y),color);
x=x+1;
y=y+k;
}else
for(i=y1;i<=y2;i++)
{putpixel(ROUND(x),ROUND(y),color);
x=x+1/k;
y=y+1;
}
}
voidlineBre(intxs,intys,intxe,intye,intcolor)//Bresenham画直线
{intx,y,k,steps;
floatm,e;
m=(float)(ye-ys)/(xe-xs);
e=m-0.5;
steps=xe-xs;
x=xs;
y=ys;
for(k=0;k{putpixel(x,y,color);
if(e>=0)
{
y=y+1;
e=e-1;
}
x=x+1;
e=e+m;
}
}
voidline(intx1,inty1,intx2,inty2,intcolor)//驻点比较画直线
{
intx,y,n;
intf;
n=(x2-x1)+(y2-y1);
x=x1;
y=y1;
f=y*x2-y2+x;
for(inti=1;i<=n;i++)
{putpixel(x,y,color);
if(f>=0)
{
x=x+1;
y=y;
}
else
{
x=x;
y=y+1;
}
f=y*x2-y2*x;
}
}
voidcircleMidpoint(intxc,intyc,intr)//中点画圆法
{
intx=0;
inty=r;
intp=1-r;
voidcircleplotpoints(int,int,int,int);
circleplotpoints(xc,yc,x,y);
while(x{
x++;
if(p<0)
p+=2*x+1;
else
{
y--;
p+=2*(x-y)+1;
}
circleplotpoints(xc,yc,x,y);
}
}
voidcircleplotpoints(intxc,intyc,intx,inty)
{
putpixel(xc+x,yc+y,YELLOW);
putpixel(xc-x,yc+y,YELLOW);
putpixel(xc+x,yc-y,YELLOW);
putpixel(xc-x,yc-y,YELLOW);
putpixel(xc+y,yc+x,YELLOW);
putpixel(xc-y,yc+x,YELLOW);
putpixel(xc+y,yc-x,YELLOW);
putpixel(xc-y,yc-x,YELLOW);
}
arc(intxc,intyc,doubler,doublets,doublete)//数值微分法产生园弧(DDA算法)
{doublerad,tsl,tel,deg,dte,ta,ct,st;
intx,y,n,i;
rad=0.0174533;
tsl=ts*rad;
tel=te*rad;
if(r<5.08)
deg=0.015;
elseif(r<7.62)
deg=0.06;
elseif(r<25.4)
deg=0.075;
else
deg=0.15;
dte=deg*25.4/r;
if(teltel=tel+6.28319;
n=(int)((tel-tsl)/dte+0.5);
if(n==0)
n=(int)(6.28319/dte+0.5);
ta=tsl;
x=xc+r*cos(tsl);
y=yc+r*sin(tsl);
moveto(x,y);
for(i=1;i<=n;i++)
{
ta=ta+dte;
ct=cos(ta);
st=sin(ta);
x=xc+r*ct;
y=yc+r*st;
lineto(x,y);
}
x=xc+r*cos(tel);
y=yc+r*sin(tel);
lineto(x,y);
return(0);
}
voidcircleBre(intr)//Bresenham画园算法
{intx=0,y=r,d=3-2*r;
while(x{
putpixel(x,y,RED);
if(d<0)
d=d+4*x+6;
else
{
d=d+4*(x-y)+10;
y=y-1;
}
x=x+1;
}
if(x==y)
putpixel(x,y,RED);
}
ellipse(intxc,intyc,doublea,doubleb,doublealp,doublets,doublete)//角度DDA法产生椭圆弧
{
doublerad,tsl,tel,alpl,deg,dte,r,ta,a1,a2,b1,b2;
intx,y,n,i;
rad=0.0174533;
tsl=ts*rad;
tel=te*rad;
alpl=alp*rad;
a1=a*cos(tsl);
b1=cos(alpl);
a2=b*sin(tsl);
b2=sin(alpl);
r=(a>b)?
a:
b;
if(r<5.08)
deg=0.015;
elseif(r>7.62)
deg=0.06;
elseif(r<25.4)
deg=0.075;
else
deg=0.15;
dte=deg*25.4/r;
if(teltel+=6.28319;
n=(int)(6.28319/dte+0.5);
ta=tsl;
x=xc+a1*b1-a2*b2;
y=yc+a1*b2+a2*b1;
moveto(x,y);
for(i=1;i<=n;i++)
{
ta+=dte;
a1=a*cos(ta);
a2=b*sin(ta);
x=xc+a1*b1-a2*b2;
y=yc+a1*b2+a2*b1;
lineto(x,y);
}
a1=a*cos(tel);
a2=b*sin(tel);
x=xc+a1*b1-a2*b2;
y=(int)yc+a1*b2+a2*b1;
lineto(x,y);
return(0);
}
voidellipse(intx0,inty0,inta,intb,intdt)
{
intx,y,n,i;
floatt1,t=0.0;
t1=(float)dt*0.0174533;
n=360/dt;
moveto(x0+a,y0);
for(i=1;i{
t=t+t1;
x=(int)x0+a*cos(t);
y=(int)y0+b*sin(t);
lineto(x,y);
}
lineto(x0+a,y0);
}
Par(intxs,intys,intxm,intym,intxe,intye)//二次曲线的参数拟合法
{
doubled,d1,ax,ay,bx,by;
intn,i;
ax=(xe-2*xm+xs)*2.0;
ay=(ye-2*ym+ys)*2.0;
bx=(xe-xs-ax);
by=(ye-ys-ay);
n=(int)sqrt(ax*ax+ay*ay)/4;
n=(int)sqrt(n*100);
moveto(xs,ys);
d=1.0/n;
d1=d;
for(i=0;i<=n;i++)
{lineto((int)(ax*d1*d1+bx*d1+xs),(int)(ay*d1*d1+by*d1+ys));
d1=d1+d;
}
lineto(xe,ye);
return(0);
}
voidmain()
{
printf("1:
DDA画直线.\n");
printf("2:
Bresenham画直线.\n");
printf("3:
驻点比较画直线.\n");
printf("4:
中点画圆法.\n");
printf("5:
数值微分法产生园弧(DDA算法).\n");
printf("6:
Bresenham画园算法.\n");
printf("7:
角度DDA法产生椭圆弧.\n");
printf("8:
二次曲线的参数拟合法.\n");
printf("0:
退出.\n\n");
while(true)
{
printf("请输入你要选择的方法:
\n");
inta;
scanf("%d",&a);
switch(a)
{
case0:
exit(0);
case1:
initgraph(640,480);
lineDDA(100,100,400,450,YELLOW);
break;
case2:
initgraph(640,480);
lineBre(100,100,450,500,YELLOW);
break;
case3:
initgraph(640,480);
line(100,100,450,500,YELLOW);
break;
case4:
initgraph(640,480);
circleMidpoint(100,100,50);
break;
case5:
initgraph(640,480);
arc(200,200,100,30,90);
break;
case6:
initgraph(640,480);
circleBre(100);
break;
case7:
initgraph(640,480);
ellipse(100,100,50,60,20,30,90);
break;
case8:
initgraph(640,480);
Par(100,100,300,350,50,100);
break;
default:
printf("错误\n");
}
getch();
cleardevice();
closegraph();
}
}