计算机图形学复习题.docx

上传人:b****6 文档编号:6169789 上传时间:2023-01-04 格式:DOCX 页数:15 大小:312.21KB
下载 相关 举报
计算机图形学复习题.docx_第1页
第1页 / 共15页
计算机图形学复习题.docx_第2页
第2页 / 共15页
计算机图形学复习题.docx_第3页
第3页 / 共15页
计算机图形学复习题.docx_第4页
第4页 / 共15页
计算机图形学复习题.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机图形学复习题.docx

《计算机图形学复习题.docx》由会员分享,可在线阅读,更多相关《计算机图形学复习题.docx(15页珍藏版)》请在冰豆网上搜索。

计算机图形学复习题.docx

计算机图形学复习题

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;y

for(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(x

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);

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(x1

intt;

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;x

for(y=0;y

intc=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(x

if(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(x

if(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(x

if(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(x

if(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;i

putpixel(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;

}

}

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

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1