计算机图形学.docx

上传人:b****6 文档编号:15724436 上传时间:2023-07-07 格式:DOCX 页数:13 大小:33.36KB
下载 相关 举报
计算机图形学.docx_第1页
第1页 / 共13页
计算机图形学.docx_第2页
第2页 / 共13页
计算机图形学.docx_第3页
第3页 / 共13页
计算机图形学.docx_第4页
第4页 / 共13页
计算机图形学.docx_第5页
第5页 / 共13页
计算机图形学.docx_第6页
第6页 / 共13页
计算机图形学.docx_第7页
第7页 / 共13页
计算机图形学.docx_第8页
第8页 / 共13页
计算机图形学.docx_第9页
第9页 / 共13页
计算机图形学.docx_第10页
第10页 / 共13页
计算机图形学.docx_第11页
第11页 / 共13页
计算机图形学.docx_第12页
第12页 / 共13页
计算机图形学.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机图形学.docx

《计算机图形学.docx》由会员分享,可在线阅读,更多相关《计算机图形学.docx(13页珍藏版)》请在冰点文库上搜索。

计算机图形学.docx

计算机图形学

//计科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(tel

tel=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(tel

tel+=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();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2