2015-11-05 34 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(); 
} 

我已经测试,它绘制一个连续的实线。