2015-11-05 35 views
2

我有一個簡單的繪畫程序,並試圖將屏幕上的內容轉換爲2d數組。在java swing中的mouseDragged方法中,您可以獲取拖動鼠標的點,但不會在足夠的時間取樣位置以獲取您繪製的所有點。從java中缺少的鼠標填充數據

public void mouseDragged(MouseEvent me) { 
    p.lineTo(me.getX(), me.getY()); 
    x=me.getX(); 
    y=me.getY(); 
    lines[me.getX()][me.getY()]=1; 
    repaint(); 
} 

在這裏我有二維數組線,其中每個空像素爲0,每個彩色像素爲1。問題是,當我打印數組時,我發現鼠標偵聽器沒有看到我在畫布上繪製的所有點。它跳過了一些要點。所以我的問題是如何連接這些缺少的點出現在屏幕上,但不是在陣列上。

例如,程序將打印,

  • {0,0,0,0,1,1,1,0,1,1,0,0,0}
  • {0 ,0,0,0,0,0,0,0,0,0,0,1,1}

我在問的是,如果有一個很好的算法來填充零應該是

我有一個高度編輯的代碼版本http://wphooper.com/java/tutorial/source/Graphics/html/simplermouseinteraction/Drawing.php

+0

你可以使用線性插值(https://en.wikipedia.org/wiki/Linear_interpolation)來填補點。如果漏點比例不太高,用戶甚至不會注意。 – Paul

回答

1

以下爲linear interpolation以矩陣的例子:

int x, y; 

public void mousePressed(MouseEvent e) { 
    x = e.getX(); 
    y = e.getY(); 
} 

public void mouseDragged(MouseEvent e) { 
    int dx = e.getX()-x, 
     dy = e.getY()-y; 
    double a; 

    //the condition is for accuracy in vertical drags 
    if (Math.abs(dx) >= Math.abs(dy)) { 
     a = dy/((double) dx); 

     for (int i = 0; Math.abs(i) < Math.abs(dx); i += Math.signum(dx)) { 
      lines[x+i][(int) (y+i*a)] = 1; 
     } 
    } else { 
     a = dx/((double) dy); 

     for (int i = 0; Math.abs(i) < Math.abs(dy); i += Math.signum(dy)) { 
      lines[(int) (x+i*a)][y+i] = 1; 
     } 
    } 

    x = e.getX(); 
    y = e.getY(); 
    repaint(); 
} 

我已經測試,它繪製一個連續的實線。