第四章:P215 1、将中点画线算法推广以便能画出任意斜率的直线 算法设计: (1)输入直线的起点坐标P(X,yo)和终点坐标P1Xx1y) (2)定义直线当前点坐标ⅹ和y,定义中点偏差判别式d、直线斜率k、像素点颜色 (3)X=x0,y=yo计算d=0.5-kk=(y1yo)/(x1-×),rgb=RGB=(0,0255) (4)绘制点(xy),判断d的符号,若d<0,则x,y)更新为(x+1,y+1),d更新为d+1-k, 否则Xx,y)更新为(x+1,y),d更新为d-k (5)如果当前点ⅹ小于(X1,重复步骤(4),否则结束。 程序主要代码 MidPointLine(Xo, yo, x1, y1,color) int a, b, delta1, delta2, d, x,y: d=2*a-b; delta1=2a: delta2=2(a+b) y= yo if(a<b) drawpixel(x, y, color): drawpixel(y, x, color) If (d<O) X++ y d+= delta2 Else D+=delta1 Putpⅸe(x, y, color)
第四章:P215 1、将中点画线算法推广以便能画出任意斜率的直线 算法设计: (1) 输入直线的起点坐标 P0(x0,y0)和终点坐标 P1(x1,y1). (2) 定义直线当前点坐标 x 和 y,定义中点偏差判别式 d、直线斜率 k、像素点颜色 rgb (3) x= x0,y= y0 计算 d=0.5-k,k=( y1-y0)/(x1-x0), rgb=RGB=(0,0,255). (4) 绘制点(x,y),判断 d 的符号,若 d<0,则(x, y)更新为(x+1,y+1),d 更新为 d+1-k, 否则(x, y)更新为(x+1,y),d 更新为 d-k. (5) 如果当前点 x 小于(x1,重复步骤(4),否则结束。 程序主要代码: 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<b) drawpixel(x, y, color); else drawpixel(y,x,color); while (x > x1) { If (d<0) { x++; y++; d+ = delta2; } Else { X++; D+=delta1; } Putpixel(x,y,color); }
While(X<x1) f(d<0) d-=delta Else d-=delta 1 Putpixel(x, y, color) 2、采用整数 Bresenham算法,为一台计算机编制直线扫描转换程序。从键盘敲入两端点坐标, 就能在显示器屏幕上画出对应的直线。 Void DrawLine(int color) int X0, yO, x1, y1, color, I scanf(%d,%,%,%",8X0,&yo,&X1,&y1) dy=y1-yo X=X for(i=O: i<=dx; i++) putpixel(x, y, color) X-X+ e=e+2*dy f(e>=0) +1; 2*d
Else While (x<x1) { If (d<0) { x--; y++; d-=delta3; } Else { x--; d-=delta1; } Putpixel(x,y,color); } } 2、采用整数 Bresenham 算法,为一台计算机编制直线扫描转换程序。从键盘敲入两端点坐标, 就能在显示器屏幕上画出对应的直线。 Void 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++) { putpixel(x, y, color); x=x+1; e=e+2*dy; if (e>=0) { y = y + 1; e = e – 2 * dy; } } }
4、试编写按逆时针方向生成第二个8分圆的中点算法 中点画圆法 0,R) 初值 (R/√2,R/√2) 算法设计: (1)输入圆的半径 (2)定义圆当前点坐标x和y、中点偏差判别式d、像素点颜色rgb (3)计算d=125Rx=0y=Rrgb=RGB=(00255) (4)绘制点(x,y),及其在八分圆中的另外7个对称点‘ (5)判断d的符号,若d<0,则(X,y)更新为x+1,y),d更新为d+2x+3,否则(x,y)更新为(x+1y-1) d更新为d+2(x-y)+5 (6)当x小于等于y,重复步骤(4)和(5),否则结束 Midpointcircle(r, color) int r. color float x, y; float d: y-r d=1.25-r/1.414 drawpixel(, y, color { if (d<O)
4、试编写按逆时针方向生成第二个 8 分圆的中点算法 算法设计: (1) 输入圆的半径 (2) 定义圆当前点坐标 x 和 y、中点偏差判别式 d、像素点颜色 rgb (3) 计算 d=1.25-R,x=0,y=R, rgb=RGB=(0,0,255). (4) 绘制点(x, y),及其在八分圆中的另外 7 个对称点‘ (5) 判断 d 的符号,若 d<0,则(x, y)更新为(x+1,y),d 更新为 d+2x+3,否则(x, y)更新为(x+1,y-1), d 更新为 d+2(x-y)+5. (6) 当 x 小于等于 y,重复步骤(4)和(5),否则结束。 MidpointCircle(r,color) int r, color; { float x,y; float d; x=0; y=r; d=1.25 –r/1.414; drawpixel(x, y, color); while (x<y) { if (d<0) {
d+=2*x+3 X++ e⊥se d+=5+2*(x-y) drawpixel(x, y, color) 5、假设圆的圆心不在原点,试编写算法对整个圆进行扫描转换 算法设计 (1)输入圆的半径r,圆心坐标为(xc,yc) (2)定义圆当前点坐标x和y、中点偏差判别式d、像素点颜色rgb (3)计算d=125Rx=0y=Rrgb=RGB=(0,0255) (4)绘制点(x+xc,y+yc),及其在八分圆中的另外7个对称点 (5)判断d的符号,若d<0,则(x,y)更新为(x+1,y),d更新为d+2x+3,否则(x,y更新为x+1y1) d更新为d+2(X-y)+5 (6)当ⅹ小于等于y,重复步骤(4)和(5),否则结束。 (1)用 bresenham画圆法,设圆心坐标为(xc,yc) bresenham circle(r, color) int r, color: int x, y, delta, deltal, delta2, direction XXC, delta=2*(l-r while (y>=0) drawpixel (x, y, color if (delta<O) deltal=2*(delta+y-b)-1 if (deltal=0 direction=1 direction=2 else if (delta>0)
d+=2*x+3; x++; } else { d+=5+2*(x-y); x++; y--; } drawpixel(x,y,color); } } 5、假设圆的圆心不在原点,试编写算法对整个圆进行扫描转换 算法设计: (1) 输入圆的半径 r, 圆心坐标为(xc,yc) (2) 定义圆当前点坐标 x 和 y、中点偏差判别式 d、像素点颜色 rgb (3) 计算 d=1.25-R,x=0,y=R, rgb=RGB=(0,0,255). (4) 绘制点(x+xc, y+yc),及其在八分圆中的另外 7 个对称点‘ (5) 判断 d 的符号,若 d<0,则(x, y)更新为(x+1,y),d 更新为 d+2x+3,否则(x, y)更新为(x+1,y-1), d 更新为 d+2(x-y)+5. (6) 当 x 小于等于 y,重复步骤(4)和(5),否则结束。 (1)用 bresenham 画圆法,设圆心坐标为(xc,yc) bresenham_circle(r,color) int r,color; { int x,y,delta,delta1,delta2,direction; x=xc; y=yc+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+xc)-1 if (delta2=0) direction=2 direction=3 direction=2 switch (direction) case 1: x+t: delta+=2*(x-xc)+1 case 2: x++. delta+=2*(x-a-y+yc+1) case 3: y-: delta+=-2*( y-yc)+1 (2)采用中点画圆算法 #include <stdio. h #include <conio. h #include <graphic MidpointCircle(r, color) int r, color float x, y float d d=1.25-r/1.414; putpixel(xc+x, olor) while (x<y if (d<o) d+=2*x+3 X++
delta2=2*(delta-x+xc)-1; if (delta2<=0) direction=2; else direction=3; } else direction=2; switch (direction) { case 1:x++; delta+=2*(x-xc)+1; break; case 2:x++; y++; delta+=2*(x-a-y+yc+1); break; case 3:y--; delta+=-2*(y-yc)+1; break; } } } (2) 采用中点画圆算法 #include <stdio.h> #include <conio.h> #include <graphics.h> MidpointCircle(r,color) int r, color; { float x,y; float d; x=0; y=r; d=1.25 –r/1.414; putpixel(xc+x, yc+y, color); while (x<y) { if (d<0) { d+=2*x+3; x++;