7

私は、pygame ライブラリを使用してサーフェスに円を描画するコードに取り組んでいます。円を描画するコードは次のようになります。

  surf = pygame.Surface((2000,2000))
  pygame.draw.circle(surf, 
                     pygame.Color("white"),
                     (1000,1000),
                     508,
                     50)

問題は、結果の円にアーティファクトがあることです アーティファクトのあるサークル

これらのアーティファクトを取得せずに、このような円を描く方法はありますか?

4

4 に答える 4

9

表示されているのは、pygame.draw.circle の実装に問題がある可能性が最も高いです。ほとんどの場合、pygame 開発者は愚かにも、複数の円を順番に描画し、円ごとに半径を 1 ずつ増やすことで太い円を描画できると想定していました。これは実際には機能せず、ご覧のようなモアレ パターンが得られます。円の線の太さを 100 または 200 増やしてみて、どうなるか見てみましょう。それが悪化した場合、それはpygame.draw.circleのせいです。

解決策は、独自の円レンダリング ルーチンを提供することです。これは確かに実行できますが、最適なパフォーマンスを得るには、pygame の C/C++ 拡張モジュールで実行するか、OpenGL を使用して (フラグメント シェーダーの有無にかかわらず) 実行するのが理にかなっています。

スキャンラインごとに完全な円を取得するには、スキャンラインごとに塗りつぶされた領域の開始と終了を計算する必要があります。pygame.draw.line を使用して個々のスキャンラインを描画することにより、許容できるパフォーマンスで Python でこれを行うことができる場合があります。

于 2012-04-13T22:22:26.867 に答える
2

このバグは、circle および arc メソッドのコメントに記載されています。draw.circle documentationのコメントに 1 つの回避策があります。これは、その回避策から適応されています。

def draw_outlined_circle(surf, color, origin, radius, thickness):
    width = radius * 2 + thickness * 2
    background = (0, 0, 0, 0)
    circle = pygame.Surface((width, width)).convert_alpha()
    rect = circle.get_rect()
    circle.fill(background)
    pygame.draw.circle(circle, color, rect.center, radius)
    pygame.draw.circle(circle, background, rect.center, radius - thickness)
    surf.blit(circle, (origin[0] - (rect.w / 2), origin[1] - (rect.w / 2)))

この方法では、エクストラSurfaceを使用して 2 つの円を描画します。大きな円の内側に小さな円を描いて、同じ効果を実現します。小さい円の塗りつぶしカラーのアルファは 0 であるため、完全な円の中心は透明に見えます。

編集: 上記のコメントから、動作が pygame FAQ にも記載されていることがわかります。

于 2012-04-14T12:44:51.477 に答える