第四章: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 x1) { If (d<0) { x++; y++; d+ = delta2; } Else { X++; D+=delta1; } Putpixel(x,y,color); }
While(X=0) +1; 2*d
Else While (x=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) drawpixel (x, y, color if (delta0)
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) { drawpixel(x,y,color); if (delta0) {
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 #include #include 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++;
Is d+=5+2*(x-y) X++ putpixel(xc+, yc+, color) putpixel(x, y, color putpixel(xc+yc-y, yc+xc-x, color) putpixel(xc+yc-y, yc+xc-x, color) putpixel(x, yctyc-y, color putpixel(xc+xc-x, yctyc-y, color) putpixel (xc-ycty, yc-xc+x, color) utpixel (xc-ycty, yc+xc-x, color) putpixel(xc+xc-x, y, color) id maino int driver=DETECT, gmode, xc, yc, r initgraph (&driver, &gmode, w) printf("please enter the xc: scanf(%d", &xc) ter the yc scanf(%d",&yc) rinf ("Please enter the R scanf(%d", &r) cleardevice o MidpointCircle(xc, yc, r, RED closegraph o
} else { d+=5+2*(x-y); x++; y--; } putpixel(xc+x,yc+y,color); } } putpixel(x,y,color); putpixel(xc+yc-y,yc+xc-x,color); putpixel(xc+yc-y,yc+xc-x,color); putpixel(x, yc+yc-y,color); putpixel(xc+xc-x,yc+yc-y,color); putpixel(xc-yc+y,yc-xc+x,color); putpixel(xc-yc+y,yc+xc-x,color); putpixel(xc+xc-x,y,color); } void main() { int gdriver=DETECT, gmode,xc,yc,r; initgraph(&gdriver, &gmode, “”); printf(“Please enter the xc:”); scanf(“%d”, &xc); printf(“Please enter the yc:”); scanf(“%d”, &yc); printf(“Please enter the R:”); scanf(“%d”, &r); cleardevice(); MidpointCircle(xc,yc, r,RED); getch(); closegraph(); }