计算机图形学 第四章习题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、将中点画线算法推广以便能画出任意斜率的直线

MidPointLine(x0,y0,x1,y1,color)

{

int a,b,delta1,delta2,d,x,y;

a = y0 – y1;

b = x1 – x0;

d = 2*a+b;

delta1 = 2 * a;

delta2 = 2 * (a+b);

x = x0;

y = y0;

if (a

drawpixel(x, y, color);

else

drawpixel(y,x,color);

while (x

{

If (d<0)

{

x++;

y++;

d+ = delta2;

}

Else

{

X++;

D+=delta1;

}

drawpixel (x,y,color);

}

Else

While (x>x1)

{

If (d<0)

{

x--;

y++;

d-=delta3;

}

Else

{

x--;

d-=delta1;

}

drawpixel (x,y,color);

}

}

2、采用整数Bresenham算法,为一台计算机编制直线扫描转换程序。从键盘敲入两端点坐标,就能在显示器屏幕上画出对应的直线。

V oid DrawLine(int color)

{

int x0,y0,x1,y1,color, I;

scanf( “%d, %d, %d, %d”, &x0, &y0, &x1, &y1);

dx=x1 – x0;

dy=y1 – y0;

e = -dx;

x = x0;

y = y0;

for ( i=0; i<=dx; i++)

{

drawpixel (x, y, color);

x=x+1;

e=e+2*dy;

if (e>=0)

{

y = y + 1;

e = e – 2 * dy;

}

}

}

4、试编写按逆时针方向生成第一个8分圆的中点算法

讨论如何从(R/√2 ,R/√2 )到(R,0)顺时针地确定最佳逼近于该圆弧的像素序列假定x 坐标为xp的像素中与该圆弧最近者已确定,为P(xp,yp)

那么,下一个像素只能是正下方的P1(Xp, Yp-1)或右下方的P2(Xp+1, Yp-1)两者之一,如图所示:

构造函数:F(x, y) = x2+y2-R2

对于圆上的点,F(x, y) = 0;

对于圆内的点,F(x, y) < 0;

对于圆外的点,F(x, y) > 0;

假设M是P1和P2的中点,即M=(Xp+0.5, Yp-1)

当F(M)<0时,M在圆内,说明P1离圆弧更近,应取P1作为下一像素

当F(M)>0时,M在圆外,说明P2离圆弧更近,应取P2作为下一像素

当F(M)=0时,M在圆上,在P1和P2之中随便取一个,取P2作为下一像素

构造判别式

d = F(M) = F(Xp+0.5, Yp-1) = (Xp+0.5)^2 + (Yp-1)^2 – R^2

当d <0时,取P1作为下一像素

而且再下一个像素的判别式为

d1 = F(Xp+0.5, Yp-2) = (Xp+0.5)^2 + (Yp-2)^2 – R^2

= d –2Yp +3

所以,沿正下方,d的增量为–2Yp +3

当d >=0时,取P2作为下一像素

而且再下一个像素的判别式为

d2 = F(Xp+1.5, Yp-2)= (Xp+1.5)^2 + (Yp-2)^2 – R^2

= d + 2Xp –2Yp +5= d + 2(Xp – Yp) + 5

所以,沿右下方,d的增量为2(Xp –Yp) + 5

由于我们这里讨论的是按顺时针方向生成第一个8分圆,因此,第一像素是(R/√2 ,R/√2 )

判别式的初值为

d0= F (R/√2 +0.5,R/√2 –1)

= 1.25 - R/√2

= 1.25 – R/1.414

MidpointCircle(r,color)

Int r, color;

{

float x,y;

float d;

x=r/1.414;

y=r/1.414;

d=1.25 –r/1.414;

drawpixel(x, y, color);

while (y>0)

{

if (d<0)

{

d+=3-2*y;

y--;

}

else

{

d+=5+2*(x-y);

x++;

y--;

}

drawpixel(x,y,color);

}

}

5、假设圆的圆心不在原点,试编写算法对整个圆进行扫描转换(1)用bresenham画圆法,设圆心坐标为(a,b)

bresenham_circle(r,color)

int r,color;

{

int x,y,delta,delta1,delta2,direction;

x=a;

y=b+r;

delta=2*(1-r);

while (y>=0)

{

drawpixel(x,y,color);

if (delta<0)

{

delta1=2*(delta+y-b)-1;

if (delta1<=0)

direction=1;

else

direction=2;

}

else if (delta>0)

{

delta2=2*(delta-x+a)-1;

if (delta2<=0)

direction=2;

else

direction=3;

}

else

direction=2;

switch (direction)

{

case 1:x++;

delta+=2*(x-a)+1;

break;

case 2:x++;

y++;

相关文档
最新文档