0

Java で非常に奇妙な動作/問題が発生しています。私がやっていることは、カンバスに単純な形を描くことです。キャンバスにアクセスできる別のスレッドを追加することを決定するまで、すべてが順調に進んでいました。

したがって、2 つのスレッドがあり、それぞれが同様の形状を描画し、描画を行うために (別の非スレッド オブジェクト内の) 同じ関数に依存しています。これらの関数は、基になる描画コマンドが順不同で呼び出されるのを防ぐために同期化されています。

スレッド #2 の描画関数呼び出しの色にアルファ チャネルを含めるように設定した場合を除いて、すべてがうまく機能します。私がそうすると、次の例外が発生します。

Exception in thread "Thread-3" java.awt.geom.IllegalPathStateException: missing initial moveto in path definition
    at java.awt.geom.Path2D$Float.needRoom(Unknown Source)
    at java.awt.geom.Path2D.closePath(Unknown Source)
    at sun.java2d.pipe.PixelToShapeConverter.makePoly(Unknown Source)
    at sun.java2d.pipe.PixelToShapeConverter.fillPolygon(Unknown Source)
    at sun.java2d.pipe.ValidatePipe.fillPolygon(Unknown Source)
    at sun.java2d.SunGraphics2D.fillPolygon(Unknown Source)
    at java.awt.Graphics.fillPolygon(Unknown Source)
    at com.deadbird.zndo.Tile.drawPolygon(Tile.java:177)
    at com.deadbird.zndo.TiledImage.drawPolygon(TiledImage.java:158)
    at com.deadbird.zndo.TileSet.drawPolygon(TileSet.java:46)
    at com.deadbird.zndo.Map.drawPolygonAtCoords(Map.java:90)
    at com.deadbird.zndo.CutterThread.drawArea(CutterThread.java:146)
    at com.deadbird.zndo.CutterThread.flushTmpAreaList(CutterThread.java:107)
    at com.deadbird.zndo.CutterThread.cut(CutterThread.java:68)
    at com.deadbird.zndo.CutterThread.run(CutterThread.java:50)
    at java.lang.Thread.run(Unknown Source)

私を殺すのは、このエラーが、私が供給しているジオメトリに何か問題があることを示しているように見えることです.アルファ値を指定すると、プログラムは問題なく正常に動作し、大量のデータを簡単に処理できます。また、描画関数は 2 つのスレッドで問題が発生する兆候をまったく示していません。

また、スレッド #1 では、カラー オブジェクトのアルファ値を使用して同じ描画関数を呼び出すことに問題はなく、これらの結果は問題なく描画されることにも注意してください。

私の質問は、この不一致の原因は何ですか? 同じ関数、2 つのスレッド、1 つはアルファ色と非アルファ色でうまく描画され、もう 1 つは非アルファ色でのみ動作するようです。

これは問題の機能です:

public synchronized void drawPolygon(double[] x, double[] y, Color color) {

    // Create polygon
    int[] intX = new int[x.length];
    int[] intY = new int[y.length];

    // Convert the double array to an int array
    for (int i=0; i < intX.length; i++) {
        intX[i] = (int) x[i]; 
        intY[i] = (int) y[i]; 
    }

    Polygon poly = new Polygon(intX, intY, intX.length);

    // Now draw that poly
    g.setColor(color);
    g.fillPolygon(poly);

}

問題の原因をより具体的にすると、これは機能します。

drawPolygon(x, y, new Color(13, 191, 0) );

これは...

drawPolygon(x, y, new Color(13, 191, 0, 30) );

興味深いのは、これを形状オブジェクトに供給しているのではなく、X 値と Y 値の静的セットを与えて、Java にそれらを多角形オブジェクトにアセンブルさせていることです。どのようなパス形成が行われたとしても、Polygon のオブジェクトによってすべて正しく処理される必要があります (そして、新しいスレッドを導入するまで問題なく機能していましたが、ここでは問題ではないと思います)。

これはどうやら内部の問題のように見えますが、何か考えはありますか?

-コーディ

4

1 に答える 1

0

わかりましたので、私はそれを理解しました。

「カット」スレッド(問題を引き起こしているスレッド)で行イテレータを使用してエリア(java.awt.geom.Area)を分割して描画しようとしていました。Area を描画する正しい方法は、fillPolygon の代わりに Graphics2D の fill メソッドを使用することです。Fill は、Area を含む任意の形状オブジェクトを描画できます。

-コーディ

于 2012-09-16T02:05:14.867 に答える