计算机图形学复习题.docx
《计算机图形学复习题.docx》由会员分享,可在线阅读,更多相关《计算机图形学复习题.docx(15页珍藏版)》请在冰豆网上搜索。
计算机图形学复习题
3.4、仿照多边形区域填充算法,写出圆域的填充算法。
方法一:
套用边界标志算法:
edgeMarkFill(intx0,inty0,intr,intcolor)
{intinsideFlag=0,c1=0,c2=0;
intmax,min;
inti,j,x,y;
max=y0+r;min=y0-r;
for(y=min+1;yfor(x=x0-r-1; x<=x0+r ;x++)
{c1=c2;c2=getpixel(x,y);
if(c1==color&&c2!
=color)
insideFlag=!
insideFlag;
if(insideFlag)putpixel(x,y,color);
}
}
#include
main()
{intgd=DETECT,gm,color=RED;
intx,y,r;
scanf("%d%d%d",&x,&y,&r);
initgraph(&gd,&gm,"d:
\\turboc2");
setbkcolor(BLUE);
setcolor(color);
circle(x,y,r);
edgeMarkFill(x,y,r,color);
getch();
closegraph();
}
方法二:
扫描圆弧时直接填充
circleFill(intx0,inty0,intr,intcolor){
intx,y,x1;floatd;
x=0;y=r;d=1.25-r;
while(xfor(x1=x0-x;x1<=x0+x;x1++)
putpixel(x1,y+y0,color);
for(x1=x0-y;x1<=x0+y;x1++)
putpixel(x1,x+y0,color);
for(x1=x0-x;x1<=x0+x;x1++)
putpixel(x1,-y+y0,color);
for(x1=x0-y;x1<=x0+y;x1++)
putpixel(x1,-x+y0,color);
if(d<0){d+=2*x+3;x++;}
else{d+=2*(x-y)+5;x++;y--;}
}
}
#include
main()
{intgd=DETECT,gm,color=RED;
intx,y,r;
scanf("%d%d%d",&x,&y,&r);
initgraph(&gd,&gm,"d:
\\turboc2");
circleFill(x,y,r,color);
getch();
closegraph();
}
3.6、编写一个程序实现绘制三个像素宽的斜率在0~1之间的点划线。
voidMidpointLine(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
intpattern[32]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,1,1,0,0,0,0,0,0},i=0;
a=y0-y1;b=x1-x0;d=2*a+b;
d1=2*a;d2=2*(a+b);
x=x0;y=y0;
while(x<=x1){
if(pattern[i%32]){
putpixel(x,y+1,color);
putpixel(x,y,color);
putpixel(x,y-1,color);
}
if(d<0){x++;y++;d+=d2;}
else{x++;d+=d1;}
i++;
}
}
main(){
intx0,y0,x1,y1;
floatk;
intgdriver=DETECT,gmode;
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
if(x0==x1||(y1-y0)/(x1-x0)>1||(y1-y0)/(x1-x0)<0)
printf("InputError!
");
else{initgraph(&gdriver,&gmode,"d:
\\turboc2");
if(x1intt;
t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
}
MidpointLine(x0,y0,x1,y1,WHITE);
}
getch();
closegraph();
}
3.9、根据过取样中的简单平均方法,结合一个直线扫描转换算法,编写一个反走样的直线扫描转换算法。
#defineW640
#defineH480
voidMidpointLine(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
intbuffer[2*W][2*H];
for(x=0;x<2*W;x++)
for(y=0;y<2*H;y++)
buffer[x][y]=BLACK;
x0*=2;x1*=2;
y0*=2;y1*=2;
a=y0-y1;b=x1-x0;d=2*a+b;
d1=2*a;d2=2*(a+b);
x=x0;y=y0;
while(x<=x1){
buffer[x][y]=color;
if(d<0){x++;y++;d+=d2;}
else{x++;d+=d1;}
}
for(x=0;xfor(y=0;yintc=buffer[2*x][2*y]+buffer[2*x+1][2*y]+
buffer[2*x][2*y+1]+buffer[2*x+1][2*y+1];
putpixel(x,y,c/4);
}
}
4.1、对于三次参数曲线,如果已知两个端点的位置矢量及二阶导数矢量,试求出相应的调和函数和系数矩阵M。
设曲线方程为:
4、给定四点P1(0,0,0),P2(1,2,1),P3(2,-3,-1),P4(3,0,2),用其作为特征多边形来构造一条三次Bezier曲线,并计算曲线上参数为1/3的点。
设曲线方程为:
递推分割法求t=1/3处的点:
或根据定义求t=1/3处的点:
8.如图5.24所示,在5.3.6节中,将三棱锥ABCD绕过Q(2,2,2)与x轴平行的直线逆时针方向旋转90°,写出变换矩阵。
(3)将坐标系平移回原来的位置:
因此复合变换矩阵:
变换后的三棱锥:
实验一:
直线的画法
#include
#include
main(){
intx0,y0,x1,y1,t;floatk;
intgdriver=DETECT,gmode;
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
initgraph(&gdriver,&gmode,“c:
\\tc\\bgi");
if(x0==x1)LineV(x0,y0,y1,WHITE);
else{if(x1{t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
}
k=(float)(y1-y0)/(x1-x0);
if(k>=0&&k<1)MidpointLine1(x0,y0,x1,y1,WHITE);
elseif(k<0&&k>=-1)MidpointLine2(x0,y0,x1,y1,WHITE);
elseif(k>1)MidpointLine3(x0,y0,x1,y1,WHITE);
elseMidpointLine4(x0,y0,x1,y1,WHITE);
}
getch();closegraph();
}
voidMidpointLine1(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
a=y0-y1;b=x1-x0;d=2*a+b;
d1=2*a;d2=2*(a+b);
x=x0;y=y0;
putpixel(x,y,color);
while(xif(d<0){x++;y++;d+=d2;}
else{x++;d+=d1;}
putpixel(x,y,color);
}
}
voidMidpointLine2(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
a=y0-y1;b=x1-x0;d=2*a-b;
d1=2*a;d2=2*(a-b);
x=x0;y=y0;
putpixel(x,y,color);
while(xif(d<0){x++;d+=d1;}
else{x++;y--;d+=d2;}
putpixel(x,y,color);
}
}
voidMidpointLine3(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
a=y0-y1;b=x1-x0;d=a+2*b;
d1=2*b;d2=2*(a+b);
x=x0;y=y0;
putpixel(x,y,color);
while(xif(d<0){y++;d+=d1;}
else{x++;y++;d+=d2;}
putpixel(x,y,color);
}
}
voidMidpointLine4(intx0,inty0,intx1,inty1,intcolor){
inta,b,d1,d2,d,x,y;
a=y0-y1;b=x1-x0;d=a-2*b;
d1=-2*b;d2=2*(a-b);
x=x0;y=y0;
putpixel(x,y,color);
while(xif(d<0){x++;y--;d+=d2;}
else{y--;d+=d1;}
putpixel(x,y,color);
}
}
实验二:
Beizer曲线的生成算法
#include
#include
main()
{
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"d:
\\tc2");
floatcontrol[2][4];
floatpoints[2][1000];inti,np=1000;
printf("InputControlPoint:
");
for(i=0;i<4;i++)
scanf("%f%f",&control[0][i],&control[1][i]);
bzeierCasteljau(4,np,control[0],points[0]);
bzeierCasteljau(4,np,control[1],points[1]);
for(i=0;iputpixel(points[0][i],points[1][i],WHITE);
getch();
closegraph();
}
floatCasteljau(intn,floatc[],floatt)
{
intk,i;floatt1=1-t,csa[10];
for(i=0;i<=n;i++)
csa[i]=c[i];
for(k=1;k<=n;k++)
for(i=0;i<=n-k;i++)
csa[i]=t1*csa[i]+t*csa[i+1];
returncsa[0];
}
voidbzeierCasteljau(intn,intnpoints,floatc[],floatp[])
{
intk,i;
floatt=0,delt=1.0/npoints;
for(i=0;i<=npoints;i++)
{
p[i]=Casteljau(n,c,t);
t+=delt;
}
}