1、第四章:P2151、将中点画线算法推广以便能画出任意斜率的直线算法设计:(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)y = y + 1; e = e 2 * dy;4、试编写按逆时针方向生成第二个 8 分圆的中点算法算法设计:(1) 输入圆的半径(2) 定义圆当前点
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)drawpixel(x,y,color);if (delta0)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+
3、y, color);while (xy)if (d0)d+=2*x+3;x+;elsed+=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);putp
4、ixel(xc+xc-x,y,color);void main()int gdriver=DETECT, gmode,xc,yc,r;initgraph(printf(“Please enter the xc:”);scanf(“%d”, printf(“Please enter the yc:”);scanf(“%d”, printf(“Please enter the R:”);scanf(“%d”, cleardevice();MidpointCircle(xc,yc, r,RED);getch();closegraph();6、试编写可以对一段任意圆弧进行扫描转换的算法将 360 度的
5、区域分成 8 个部分3 24 15 86 7编写可以对一段任意圆弧进行扫描转换的算法的关键在于,对这段圆弧的起点和终点分别判定是否在同一区域如果起点和终点在同一区域,调用中点画圆算法,但要根据实际情况对参数进行修正;如果起点和终点不在同一区域,则要根据实际情况对圆弧段进行分割,分割的原则是将每一段的起点和终点放在同一区域,然后分别调用中点画圆算法画圆弧,同样在画的过程中,要根据实际情况对参数进行修正及算法进行修正;设圆弧的起点为(x1,y1),终点为(x2,y2),半径为 r如图A(x1,y1)D(x0-r,y0) C (x0,y0) B(x2,y2)将整个圆弧分为两段,弧 AC 和弧 CB,
6、分别进行扫描转换,转换过程中利用中点画圆方法进行,代码如下:midpoint(x1,y1,x2,y2,r,color,k)int x,y;float d;x=x1;y=y1;d=(x1+1)2+(y1-0.5)2-r2;putpixel(x,y,color);while (x=x2)if (d0)d+=2*x+3;x+;elsed+=2*(x-y)+5;x+;y=y+k;putpixel(x,y,color);main()scanf(“%d”,/分割的圆弧数for (i=1;i=n;i+) scanf(“%d,%d,%d,%d,%d”, /要求 x1x2midpoint(x1,y1,x2,y2
7、,r,color,k);7、设计一个多边形区域填充算法,使其边界像素具有一个值,而内部的像素具有另一个值。算法设计:(1) 使用画线语句绘制多边形(2) 计算窗口客户区的水平边界最大值 MaxX 和垂直边界最大值 MaxY(3) 调用系统调色板,设置颜色值 FillColor 为调色板上取得的颜色,CBackColor 为白色。 (4) 对于每一条边,y 从 ymin开始,执行下面的循环。(5) x 从扫描线和边的交点处开始到窗口客户区右边界,先获得(x, y)位置的像素颜色,如果是填充色,则置成背景色,否则所有填充色填充。执行 x=x+1/k,计算下一个 x 起点值。(6) 如果 y=ymi
8、n,则扫描结束,否则 y+,转(5) 。主要代码:int MaxX,MaxY; Void GetMaxX() /求屏幕最大 x 值CRect rect;GetClientRect(rect);MaxX=rect.riht;Void GetMaxY() /求屏幕最大 y 值CRect rect;GetClientRect(rect);MaxX=rect.bottom;Void Draw() /填充多边形函数COLORREF CBackColor=RGB(255,255,255);/白色CClientDC dc(this);int m,n,ymin,ymax;double x,y,k;for (i
9、nt i=0; i=6; i+)m=i,n=i+1;if (7=n) n=0;k=(double (Point m.x- Point n.x)/ (Point m.y- Point n.y);/计算 1/k;if (Point m.y Point n.y) /得到每条边 y 的最大和 y 最小值ymin= Point m.y;ymax= Point n.y;x=Point m.x; /得到 x|yminelseymin= Point n.y;ymax= Point m.y;x=Point n.x; For (y=ymin;yymax;y+)For(int j=ROUND(x);jMaxX;j+
10、)/对每一条扫描线与边的交点的右侧像素循环If(dc.GetPixel(j, ROUND(y)=FillColor)/如果像素的颜色是填充色dc.SetPixel(j, ROUND(y),CBackColor);/改为背景色elsedc.SetPixel(j, ROUND(y),FillColor);/改为填充色x+=k; /计算下一个 x 起点值DrawPolygon() /绘制多边形函数CClientDC dc(this);int m,n;for (int j=0;j=6;j+)M=j;n=j+1;If (7=n) n=0;dc.MoveTo(Pointm);dc.LineTo(Point
11、n);10、试设计一个生成具有宽度的直线条的算法,使得在直线条连接处不出现图示的缺口对于第一种方案:c d ea b f 可以把整个线条分成两个部分,对于左半部分:先计算出线条的四个顶点,a,b,c,d再用直线段把相邻角点连接起来,最后调用多边形填充算法把所得的四边形进行填色同样,对于右半部分,依法处理对于第二种方案:ced f ga b h 可以把整个线条分成三个部分,对于左半部分:先计算出线条的四个顶点,a, b, c, d再用直线段把相邻角点连接起来,最后调用多边形填充算法把所得的四边形进行填色对于中间部分:先计算出线条的四个顶点,c, d, e,f再用半径为某个值如 R 圆弧分别把 c, e 和 d, f 连接起来,最后调用区域填充算法把所得的圆环段 c, e, d, f 进行填色同样,对于右半部分,依法处理先计算出线条的四个顶点,e, f, g, h再用直线段把相邻角点连接起来,最后调用多边形填充算法把所得的四边形进行填色12、为 26 个英文大写字母设计 5X7 的字符掩膜矩阵。
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。