📅  最后修改于: 2021-01-13 09:34:20             🧑  作者: Mango
在屏幕上画圆比画线要复杂一些。有两种流行的生成圆的算法-Bresenham算法和中点圆算法。这些算法基于确定绘制圆所需的后续点的思想。让我们详细讨论算法-
圆的方程为$ X ^ {2} + Y ^ {2} = r ^ {2},$,其中r为半径。
我们无法在栅格显示屏上显示连续弧。相反,我们必须选择最近的像素位置才能完成弧线。
从下图可以看到,我们已将像素放置在(X,Y)位置,现在需要确定将下一个像素放置在N(X + 1,Y)或S(X + 1, Y-1)。
这可以由决策参数d决定。
步骤1-获取圆心和半径中心的坐标,并将它们分别存储在x,y和R中。设置P = 0和Q = R。
步骤2-设置决策参数D = 3 – 2R。
步骤3-重复步骤8,同时P≤Q。
步骤4-调用绘制圆(X,Y,P,Q)。
步骤5-递增P的值。
步骤6-如果D <0,则D = D + 4P + 6。
步骤7-其他集R = R-1,D = D + 4(PQ)+ 10。
步骤8-调用绘制圆(X,Y,P,Q)。
Draw Circle Method(X, Y, P, Q).
Call Putpixel (X + P, Y + Q).
Call Putpixel (X - P, Y + Q).
Call Putpixel (X + P, Y - Q).
Call Putpixel (X - P, Y - Q).
Call Putpixel (X + Q, Y + P).
Call Putpixel (X - Q, Y + P).
Call Putpixel (X + Q, Y - P).
Call Putpixel (X - Q, Y - P).
步骤1-输入半径r和圆心$(x_ {c,} y_ {c})$并获得以原点为中心的圆的圆周上的第一点为
(x0, y0) = (0, r)
步骤2-将决策参数的初始值计算为
$ P_ {0} $ = 5/4 – r(请参见以下描述,以简化该方程式。)
f(x, y) = x2 + y2 - r2 = 0
f(xi - 1/2 + e, yi + 1)
= (xi - 1/2 + e)2 + (yi + 1)2 - r2
= (xi- 1/2)2 + (yi + 1)2 - r2 + 2(xi - 1/2)e + e2
= f(xi - 1/2, yi + 1) + 2(xi - 1/2)e + e2 = 0
Let di = f(xi - 1/2, yi + 1) = -2(xi - 1/2)e - e2
Thus,
If e < 0 then di > 0 so choose point S = (xi - 1, yi + 1).
di+1 = f(xi - 1 - 1/2, yi + 1 + 1) = ((xi - 1/2) - 1)2 + ((yi + 1) + 1)2 - r2
= di - 2(xi - 1) + 2(yi + 1) + 1
= di + 2(yi + 1 - xi + 1) + 1
If e >= 0 then di <= 0 so choose point T = (xi, yi + 1)
di+1 = f(xi - 1/2, yi + 1 + 1)
= di + 2yi+1 + 1
The initial value of di is
d0 = f(r - 1/2, 0 + 1) = (r - 1/2)2 + 12 - r2
= 5/4 - r {1-r can be used if r is an integer}
When point S = (xi - 1, yi + 1) is chosen then
di+1 = di + -2xi+1 + 2yi+1 + 1
When point T = (xi, yi + 1) is chosen then
di+1 = di + 2yi+1 + 1
步骤3-在从K = 0开始的每个$ X_ {K} $位置,执行以下测试-
If PK < 0 then next point on circle (0,0) is (XK+1,YK) and
PK+1 = PK + 2XK+1 + 1
Else
PK+1 = PK + 2XK+1 + 1 – 2YK+1
Where, 2XK+1 = 2XK+2 and 2YK+1 = 2YK-2.
步骤4-确定其他七个八分圆中的对称点。
步骤5-将每个计算的像素位置(X,Y)移动到以$(X_ {C,} Y_ {C})$为中心的圆形路径上,并绘制坐标值。
X = X + XC, Y = Y + YC
步骤6-重复步骤3至5,直到X> =Y。