计算机图形学 第四章习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++;