📜  圆生成算法

📅  最后修改于: 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决定。

  • 如果d <= 0,则将N(X + 1,Y)选择为下一个像素。
  • 如果d> 0,则将S(X + 1,Y-1)选择为下一个像素。

算法

步骤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。