代码之家  ›  专栏  ›  技术社区  ›  horseyguy

画圆弧的有效算法?

  •  4
  • horseyguy  · 技术社区  · 15 年前

    我正在使用中点圆算法(Bresenham圆)有效地绘制整个圆。是否有类似于画圆弧的东西?我想指定一个起始角和结束角,并且只画圆的那部分。

    事先谢谢!

    编辑: 我还想画填充圆弧,即饼切片。:)

    2 回复  |  直到 15 年前
        1
  •  1
  •   David Cary    15 年前

    您的平台是否已经有了一些库来处理绘制这些形状?

    绘制填充饼图扇区:

    首先,将馅饼垂直和水平切成四分之一。 如果您的饼切片正好是这些四分之一,或者完全适合这些四分之一,那么使用以下过程一次。 否则,您的饼切片已被切割成碎片——这可能发生在一些非常瘦的饼拼接上——对每一块重复以下步骤。

    我将描述一个适合右上角四分之一的饼片——其他四分之一类似。 找到弧的开始和结束像素(这可能需要一些三角函数)。 我假设右上角的弧的“开始”像素比“结束”像素高,并且在“结束”像素的左侧——如果不是,交换它们使之成为这样。

    使用Bresenham圆算法从顶部开始查找该四分之一圆边缘上的所有像素。忽略这些值直到到达“开始”像素,“活动”像素是圆边缘上从开始像素到结束像素的点。

    使用Bresenham线算法查找“左”线上的像素(从弧的“开始”像素开始,并直接到圆的中心的线)。

    对于弧的每个扫描行(每个Y值),绘制一条水平线以覆盖从左线最左侧像素到弧上最右侧活动像素的所有水平像素。 (靠近四分之一圆的顶部,边缘上可能有许多像素位于同一扫描行的Y值上)

    一旦你处理完圆形边缘的所有活动像素, 如果有的话,填写剩余的三角形。 一种方式: 对于每个扫描行(每个Y值),从上到下绘制一条水平线,覆盖从左行最左边像素到右行最右边像素的所有水平像素, 直到你到达圆的中心。 (如果开始像素接近此四分之一圆的底部,则在同一扫描行Y值的左行和右行上可能有多个像素)。

        2
  •  2
  •   Krumelur    15 年前

    计算圆弧的起点和终点,并在到达该点时终止。参见 http://en.wikipedia.org/wiki/Midpoint_circle_algorithm