0

我正在编写一个小型绘图程序。但我有绘画的错误。左,右,确实工作正常,但顶部,底部会产生奇怪的图像。为什么?任何人的想法?我用java编程。错误:(左正常,右错误)不,它不是因为 mouseevent 没有得到所有分数。我在我实际得到的点之间画了所有圆圈。看代码。

左:正常|右:错误

绘画代码:

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

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

于 2013-11-09T19:38:38.007 回答