Javaがポリゴンをどのように塗りつぶすのか、しばらくの間疑問に思っていました.スキャンラインアルゴリズムなどで自分で試してみました. それは非常に明確に思えるので、スキャンラインも使用しますか、それともまったく異なる種類のアルゴリズムですか? (ソースで検索してみましたが、迷路です。)
よろしく
Open JDK ソースはオンラインで入手できます。したがって、コードを自分で見ることができますが、そのコードを見て、自分のコードの「インスピレーション」と見なされるものを使用することで、OpenJDK ライセンス条件の対象となる可能性が高いことに注意してください。コードに互換性のあるライセンスを使用する意思がない限り、あまり詳しく調べないでください。
share/classes/java/awt/Graphics.java
含むインターフェイスです。fillPolygon
これは抽象メソッドであるため、そのインターフェイスを実装するクラスを確認する必要があります。share/classes/sun/java2d/SunGraphics2D.java
はそのようなものです。オブジェクトfillPolygon
の一致する呼び出しに呼び出しを委譲するだけです。sun.java2d.pipe.PixelFillPipe
しかし、これは単なるインターフェースであるため、実装を探す必要があります。share/classes/sun/java2d/pipe/BufferedRenderPipe.java
可能な実装の 1 つです。そのfill
実装はfillSpans
メソッドを使用し、そのコアはネイティブ コードで実装されます。share/native/sun/java2d/pipe/BufferedRenderPipe.c
対応する実装があります。したがって、コードを見て、スパンとは何か、ポリゴンがどのようにスパンに変換されるかを理解したら、スパンがどのようにレンダリングされるかがわかります。上記はすべて、考えられるコード パスの1 つにすぎません。それは、使用しているプラットフォームと、何に描画しているかによって大きく異なります。印刷にはさまざまなプリミティブがあり、ほとんどのプラットフォームにはさまざまなプリミティブがあります。たとえば、(高速化されていない) X11 接続でsolaris/native/sun/java2d/x11/X11Renderer.c
は、単純に に委任しXFillPolygon
ます。OpenGL ベースのグラフィックス用のカスタム コードもありますが、今のところ塗りつぶしの最適化は見られません。でも、じっくり見てみるのもいいかもしれません。