绘图程序错误

时间:2013-11-09 19:29:28

标签: java path drawing mouseevent

我正在编写一个小型绘图程序。 但我有一个绘画的错误。左,右,确实工作正确,但顶部,底部创造了好奇的图像。为什么?你有什么想法吗?我在java编程。 Bug :(左边正常,右边的bug)而且没有ISNT因为mouseevent没有得到所有的点数。我画了所有圈子到我实际得到的点之间。看到代码。

left:normal|right:bug

绘画代码:

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);
    }
}

2 个答案:

答案 0 :(得分:1)

鼠标事件很棘手,它们并不总是遵循线性进展。我不会使用椭圆,而是简单地在每个不同的事件点​​之间绘制线条。如果你需要使线条变粗,请看一下Stroke(或特别是BasicStroke)

例如Resize the panel without revalidation

使用getGraphics代替使用paintComponent

,我也非常不喜欢您的绘画直接绘制到图形上下文

答案 1 :(得分:0)

假设你绘制一条接近垂直的行,宽度= 10,高度= 200.使用给定的循环,你将精确绘制10个点,这不足以覆盖整行。

要解决此问题,您需要检查身高&gt;宽度,在这种情况下,绘制点“垂直”,沿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);
}

正如您所看到的,绘制单条线的算法变得非常复杂。这就是为什么Bresenham's algorithm是如此重要的原因。