0

小さな描画プログラムをプログラミングしています。しかし、私は絵にバグがあります。左、右、正しく動作しますが、上、下は奇妙な画像を作成します。なぜ?アイデアはありますか?私はJavaでプログラミングしています。バグ: (左が正常、右がバグ) いいえ、mouseevent がすべてのポイントを取得していないため、ISNT ではありません。私は実際に得たポイントの間にすべての円を描いています。コードを参照してください。

左:ノーマル|右:バグ

ペイントのコード:

double m = 0;
int width = draggedX - mouseX;
int height = draggedY - mouseY;
if(draggedX - mouseX != 0){
    m = (double) (draggedY - mouseY) / (double) (draggedX - mouseX);
}
if(width > 0){
    for(int i = 0; i < width; i++) {
        double x = mouseX + i;
        double y = mouseY + (m * i);
        g.fillOval((int) x, (int) y, 5, 5);
    }
}
else if(width < 0){
    for(int i = -width; i > 0; i--) {
        double x = mouseX - i;
        double y = mouseY - (m * i);
        g.fillOval((int) x, (int) y, 5, 5);
    }
}
else{
    if(height > 0){
        for(int i = 0; i < height; i++){
            g.fillOval(mouseX, (int) i + mouseY, 5, 5);
        }
    }
    else if(height < 0){
        for(int i = -height; i > 0; i--){
            g.fillOval(mouseX, (int) i - mouseY, 5, 5);
        }
    }
    else{
        g.fillOval(mouseX, mouseY, 5, 5);
    }
}
4

2 に答える 2

1

マウス イベントはトリッキーです。常に直線的に進行するとは限りません。楕円形を使用する代わりに、個々のイベント ポイント間に単純な線を描きます。線を太くする必要がある場合は、Stroke (または特に BasicStroke) を見てください。

たとえば、再検証せずにパネルのサイズを変更します

getGraphicsまた、使用する代わりに使用することにより、グラフィックスコンテキストに直接絵を描くのが非常に悪いと感じていますpaintComponent

于 2013-11-09T20:06:28.177 に答える
0

幅 = 10、高さ = 200 のほぼ垂直な線を描くとします。与えられたループでは、正確に 10 個の点を描くことになり、線全体を覆うには不十分です。

これを修正するには、高さ > 幅かどうかを確認する必要があります。その場合は、ポイントを「垂直に」プロットし、y 軸に沿って繰り返します。

// when height > width
for(int i = 0; i < height; i++) {
    double x = mouseX + i/m;
    double y = mouseY + i;
    g.fillOval((int) x, (int) y, 5, 5);
}

ご覧のとおり、単一の線をプロットするアルゴリズムは非常に複雑になります。そのため、ブレゼンハムのアルゴリズムは非常に重要です。

于 2013-11-09T19:38:38.007 に答える