在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)));
}
}
效果如下所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP31UMRpXT4dmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcTMyMjM0ITM3ITMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)