0

JPanel で Path2D を描画すると、奇妙な動作が発生します。


このスクリーンショットでわかるように、一部の形状は尻尾のようなものになります。

ここに画像の説明を入力

タイプを Line2D.Double に変更すると、期待どおりになります。

ここに画像の説明を入力

パス/ラインを描画するコードは次のとおりです。

Path2D.Double path = new Path2D.Double();
Graphics2D g = (Graphics2D)this.getGraphics();
for(int i=0; i<geom.size(); i++)
{
    double x = ddGeom.getX(geom.get(i));
    double y = ddGeom.getY(geom.get(i));
    if(i==0)
        path.moveTo(x-draw_center.x, y-draw_center.y);
    path.lineTo(x-draw_center.x, y-draw_center.y);
}
g.draw(path);


スクリーンショット 1 の「尻尾」がどこから来ているか分かりますか? SDK バージョン 6 を使用しています。

ご助力ありがとうございます




編集:コードスニペットをに変更するとき

if(i==0)
     path.moveTo(x-draw_center.x, y-draw_center.y);
else
     path.lineTo(x-draw_center.x, y-draw_center.y);

テールのほとんど (おそらく 75%) が消えます。なぜこれが起こるのか分かりますか?

4

2 に答える 2

2

最初の画像に表示されているものは、ほとんど「マイター」のように見えます。マイターは、結合された線の 2 つの外側の境界線が交差し、囲んでいる領域も塗りつぶされるまで延長されるパスで、線の結合を描画する方法です。

ジオメトリにほぼ同じ座標を持つ連続したポイントが含まれている可能性はありますか? 次の例では、最後の 2 つのポイントがほぼ同じ座標を持つため、同じ問題が発生します。

JFrame frame = new JFrame();

frame.setSize(300, 300);
frame.setContentPane(new Container() {
    @Override
    public void paint(Graphics graphics) {
        Graphics2D g2 = (Graphics2D) graphics;
        g2.setStroke(new BasicStroke(5));
        g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(KEY_STROKE_CONTROL, VALUE_STROKE_PURE);

        Path2D.Double path = new Path2D.Double();
        path.moveTo(200, 100);
        path.lineTo(100, 100);
        path.lineTo(101, 100.3);

        g2.draw(path);
    }
});

frame.setVisible(true);

于 2013-05-06T12:13:43.963 に答える
2

やっと手に入れました。HovercraftFullOfEels のヒント「strange Stroke」のおかげで、ストロークをいじってみました。元のストローク:

BasicStroke stroke = new BasicStroke(2.0f);

変更:

BasicStroke stroke = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);

新しいストロークでは、すべての「テール」が消えました。なぜこれが起こるのかはまだわかりませんが、誰かが同じ問題を抱えている場合、この回避策が役立つ可能性があります.

この動作の説明にはまだ非常に興味があります。

大変お世話になりました

于 2012-09-14T13:23:28.120 に答える