突然ですが、この関数で円が描けます。
三角関数を一切使わずに、円を描くロジック (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
で描いた円 - 内側の赤い円:冒頭のコードで描いた円。
遜色なし。すご
アルゴリズムの差でしょうか、同じ半径にしてもピッタリとは重ならない。
おわりに
自分には、どういう定理に基づいたアルゴリズムか分かりませんが、想像以上に綺麗に描けるので、ここに残しておきます。
元々はSSD1306ライブラリに円の描画関数がなかったことがきっかけ。
以上