9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

三角関数を使わずに円を描く

Last updated at Posted at 2023-11-03

突然ですが、この関数で円が描けます。

三角関数を一切使わずに、円を描くロジック (AdafruitのGFX-Libraryを参考にした)

def circle(center, radius, color):
    x0, y0 = center
    f = 1 - radius
    ddF_x = 1
    ddF_y = -2 * radius
    x = 0
    y = radius
    pixel((x0, y0 + radius), color)
    pixel((x0, y0 - radius), color)
    pixel((x0 + radius, y0), color)
    pixel((x0 - radius, y0), color)
    while x < y:
        if f >= 0:
            y -= 1
            ddF_y += 2
            f += ddF_y
        x += 1
        ddF_x += 2
        f += ddF_x
        pixel((x0 + x, y0 + y), color)
        pixel((x0 - x, y0 + y), color)
        pixel((x0 + x, y0 - y), color)
        pixel((x0 - x, y0 - y), color)
        pixel((x0 + y, y0 + x), color)
        pixel((x0 - y, y0 + x), color)
        pixel((x0 + y, y0 - x), color)
        pixel((x0 - y, y0 - x), color) 
  • center:中心座標 (x, y)
  • radius:半径
  • color:色

pixel(position, color):座標 (x, y) に点を描画する関数

実際に描いてみた

pygameを使い、実際に描いてみた。

  • 外側の黒い円:circle関数pygame.draw.circleで描いた円
  • 内側の赤い円:冒頭のコードで描いた円。

circle.png

遜色なし。すご



アルゴリズムの差でしょうか、同じ半径にしてもピッタリとは重ならない。

circle2.png

おわりに

自分には、どういう定理に基づいたアルゴリズムか分かりませんが、想像以上に綺麗に描けるので、ここに残しておきます。

元々はSSD1306ライブラリに円の描画関数がなかったことがきっかけ。

以上

9
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?