2013-11-09 26 views
0

IM編程一個小的畫圖程序。 但我有一個繪畫的錯誤。左,右,工作正確,但頂部,底部創建好奇的圖像。爲什麼?任何一個想法?我用java編程。 錯誤:(左正常,正確的錯誤)而不是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); 
    } 
} 
+1

鼠標事件有貓膩,他們並不總是遵循線性的進展。我不會使用橢圓形,而是在每個不同的事件點​​之間進行簡單的畫線。如果你需要讓線越厚,看看行程(或的BasicStroke尤其是) – MadProgrammer

+0

@MadProgrammer:這應該是一個答案,它肯定不是由喬尼提供的答案要好得多。 –

+0

@HovercraftFullOfEels一直在尋找一個例子,我知道我做這件事情之前幾次 – MadProgrammer

回答

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's algorithm是如此重要。

1

鼠標事件有貓膩,他們並不總是遵循線性的進展。我不會使用橢圓形,而是在每個不同的事件點​​之間進行簡單的畫線。如果你需要讓線越厚,看看行程(或的BasicStroke尤其是)

例如Resize the panel without revalidation

我也有一個非常不好的感覺你的畫直接對圖形環境使用getGraphics而是採用paintComponent

+0

IM繪圖getGraphics僅在bufferedimage上顯示,並且繪製在paintComponenet中。 –

+1

@ T_01那麼,那就好了;) – MadProgrammer