计算机图形学常用算法实现2 中点画圆法

在winform下实现,如果在其他环境,思路完全一样,只需替换画图的函数即可。
中点画圆法算是中点画线法思路的一种实际应用,本质是一样的。
1.对称画图,只需要画1/8部分的圆(我们的函数里面取45~90度部分),其他部分对称画过去即可,对称画图的代码如下:

        void drawCirclePoints(Point p1,Point p2)
        {
            Graphics g = this.CreateGraphics();
            Brush pe = new SolidBrush(Color.Red);
            g.FillRectangle(pe, new RectangleF(p2.X,p2.Y, 1, 1));
            g.FillRectangle(pe, new RectangleF(2*p1.X-p2.X, p2.Y, 1, 1));
            g.FillRectangle(pe, new RectangleF(p2.X, 2*p1.Y-p2.Y, 1, 1));
            g.FillRectangle(pe, new RectangleF(2*p1.X-p2.X,2*p1.Y-p2.Y, 1, 1));
            g.FillRectangle(pe, new RectangleF(p1.X + p2.Y - p1.Y, p1.Y + p2.X - p1.X, 1, 1));
            g.FillRectangle(pe, new RectangleF(p1.X - p2.Y + p1.Y, p1.Y + p2.X - p1.X, 1, 1));
            g.FillRectangle(pe, new RectangleF(p1.X - p2.Y + p1.Y, p1.Y - p2.X + p1.X, 1, 1));
            g.FillRectangle(pe, new RectangleF(p1.X + p2.Y - p1.Y, p1.Y - p2.X + p1.X, 1, 1));
        }

2.中点画圆
由于r的值不一定是整数,因此可能不好和中点画线法一样乘某个数取整,采用浮点数进行计算。
当然,如果采用Point 和 r这样的参数进行写函数,可以进行下一步的优化。

        void MidPointCircle(Point p1, Point p2)
        {
            float r = (float)Math.Sqrt((p1.X-p2.X)* (p1.X - p2.X)+ (p1.Y - p2.Y) * (p1.Y - p2.Y));
            float x = p1.X;
            float y = p1.Y + r;
            float d = 1.25f - r ;
            while (x-p1.X <= y-p1.Y)
            {
                if (d < 0)
                    d += 2 * x + 3 - 2 * p1.X;
                else
                {
                    d += 2 * (x - y) + 5 + 2 * p1.Y - 2 * p1.X;
                    y--;
                }
                x++;
                drawCirclePoints(p1,new Point ((int)(x+0.5),(int)(y+0.5)));
            }
            
        }

效果如下所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43813453/article/details/84563926