2013-11-09 70 views
1

我寫Java中的一個小畫PROGRAMM之間,並且在筆即時通訊stucked:獲取所有像素兩個像素

Therory:當IM拖動鼠標,我必須填寫P之間的圓圈(draggedX | draggedY)和P2(鼠標X |鼠標Y)帶圓圈。所以我必須創建一條線/一條路徑(?..)並計算其上的所有點。

什麼香港專業教育學院的嘗試:

double m = 0; 
int width = draggedX - mouseX; 
int height = draggedY - mouseY; 
if(draggedX - mouseX != 0){ 
    m = (draggedY - mouseY)/(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); 
     } 
    } 
} 

它沒有正常運行的。有時好奇線捲起和圓畫的werent,像這樣:

paint fail

任何其他的想法,如何解決呢? 謝謝!

回答

0

兩個整數之間的劃分丟棄小數部分:例如2/3返回0.您可以使用浮點類型進行計算以保留小數部分。

double m; 
m = (double) (draggedY - mouseY)/(draggedX - mouseX); 
+0

好抓,我也在想事件,也許它沒有得到所有的事件! – 2013-11-09 12:24:11

+0

ooouu謝謝你,這是我認爲的錯誤之一^^ 後來修復它,告訴它是否解決了問題! :) @ user2511414:這就是爲什麼即時繪圖mouseP和dragP之間的所有圈子;) –

0

除了什麼其他的答案說,你還需要做的圖紙不同,如果的m絕對值大於1還是不行。如果它是1或更少,那麼你會想沿x方向迭代並從斜率計算y。否則,您需要沿y方向迭代並根據(逆)斜率計算m。你在代碼中有正確的想法,但它沒有正確實施。它應該是更多的東西是這樣的:

if (abs(m) <= 1) 
{ 
    for (int i = startX; i < endX; i++) 
    { 
     float y = startY + (float)i * m; 
     float x = i; 
     g.fillOval(x, y, 5, 5); 
    } 
} 
else 
{ 
    for (int i = startY; i < endY; i++) 
    { 
     float x = startX + (float)i/m; 
     float y = i; 
     g.fillOval(x, y, 5, 5); 
    } 
} 
1

Java將不能爲所有中間點的事件 - 你可以在這裏你居然收到事件每個地方畫一個點進行測試。如果鼠標移動速度過快,你會在錯失點。這發生在所有繪圖程序中。

Bresenham's line-drawing algorithm是在兩個像素座標之間找到整數像素的傳統方法。但是你用Java進行編程,並且你有更好的東西:你可以跟蹤通過座標定義的任意路徑。兩種口味可供選擇,

舊顯卡的版本(g爲Graphics,可能是從你的paintComponent()法):

// uses current g.setColor(color) 
g.drawPolyline(xPoints, yPoints, int nPoints); // xPoints and yPoints are integer arrays 

而且新的基於形狀的版本(G2D是Graphics2D;你Graphics在Swing可強制轉換爲Graphics2D沒有問題):

// uses current stroke 
g2d.draw(p); // p is a Path2D, build with successive moveTo(point) and lineTo(point) 

我推薦的第二個版本,因爲行程提供的不僅僅是SI更多的靈活性(線寬,虛線,...)多顏色

+0

你沒看過我的代碼,我猜。 如果我有2點來自mouseevent,雖然我移動了50,但我想繪製這個2之間的所有圓圈。現在明白了嗎?... –

+0

有一箇中風 - 請參閱http://www.jhlabs上的示例。COM/JAVA/Java2D的/筆劃/。此外,您可以要求形狀爲每個X距離單位給出座標(但是Stroke仍然是正確的做法(TM)。 – tucuxi