在 C++ 中绘制不使用浮点运算的圆

2024 年 8 月 29 日 | 4 分钟阅读

在不使用浮点数学的情况下绘制圆形,必须使用仅使用整数运算的算法。Bresenham's 画圆算法是为此目的常用的算法之一。这种方法仅使用整数算术,高效且有效地创建圆形。

Bresenham's 画圆算法是 Bresenham's 直线算法的一个版本,后者用于在栅格显示器上绘制直线。它根据一种有效的决策过程选择圆周上要绘制的点,该过程仅使用整数计算。在不使用浮点运算的情况下,该方法可以决定像素应该放置在哪里,以尽可能精确地近似圆形。

决策参数用于确定要绘制的下一个点,它是 Bresenham's 画圆算法背后的主要概念。该算法通过根据先前的选择和圆的数学特性仔细更新此决策参数,仅使用基于整数的运算有效地绘制圆形。由于此特性,它适用于浮点运算可能不理想或不切实际的系统或环境。

尽管 Bresenham's 方法提供了一种无需使用浮点算术即可快速绘制圆的方法,但重要的是要记住,此方法生成的圆可能不像使用浮点运算的算法生成的圆那样精确或平滑。但是,对于许多应用程序,特别是在功能受限的机器上的计算机图形中,Bresenham's 技术是一种有用的工具,用于创建圆形和其他形状,而无需浮点数学。

编码

输出

                  . . .                   
            . . . . . . . . .             
        . . . . . . . . . . . . .         
      . . . . . . . . . . . . . . .       
    . . . . . . . . . . . . . . . . .     
    . . . . . . . . . . . . . . . . .     
  . . . . . . . . . . . . . . . . . . .   
  . . . . . . . . . . . . . . . . . . .   
  . . . . . . . . . . . . . . . . . . .   
. . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . 
  . . . . . . . . . . . . . . . . . . .   
  . . . . . . . . . . . . . . . . . . .   
  . . . . . . . . . . . . . . . . . . .   
    . . . . . . . . . . . . . . . . .     
    . . . . . . . . . . . . . . . . .     
      . . . . . . . . . . . . . . .       
        . . . . . . . . . . . . .         
            . . . . . . . . .             
                  . . .    

说明

  1. 在此示例中,当给定整数半径作为输入时,Draw_Circle 函数利用该半径计算正方形网格的大小并在其中绘制圆形。
  2. 正方形网格的尺寸由变量 N 指定,该变量设置为 2 * radius + 1。网格将有 N 行N 列,形成一个每边 N 个单位的正方形。
  3. 使用两个嵌套循环遍历正方形网格的行和列。变量 kl 负责这些循环。
  4. 嵌套循环包含变量 xyzpqr 的计算。这些变量显示了当前点相对于网格中心的坐标。
  5. if 语句确定当前点(由变量 xyz 和 pqr 表示)是否在圆内。它是通过将点到中心的平方距离与圆的平方半径进行比较(使用勾股定理)来实现的。如果点在圆内,它会打印一个句点(.),它表示一个填充点。否则,会打印一个空格(),它表示一个空点。
  6. 在遍历一行中的每个点之后,会显示一个换行符 (n),它表示过渡到网格的下一行。
  7. Draw_Circle 由主函数以半径 10 调用,并返回 0。