Простое рисование линий - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь сделать простую программу для рисования линий в Java, я храню каждый пиксель на экране в массиве для рисования.Когда пользователь перетаскивает мышь, каждый пиксель устанавливается на 1, тогда я пытаюсь перебрать и нарисовать линию между каждой парой точек.Однако он не рисует правильно, кто-то может увидеть проблему здесь?

public void mouseDragged(MouseEvent m) {
    screen[m.getX()][m.getY()] = 1;
    drawOffscreen();
}

public void mouseReleased(MouseEvent e) {
    end[e.getX()][e.getY()] = true;     
}


int prex = -1;
int prey = -1;
public void paint(Graphics g) {
    g.drawImage(offscreen, 0, 0, null);     
    for (int x = 0; x < screen.length; x++){
        for (int y = 0; y < screen[0].length; y++){
            if(screen[x][y] == 1){
                if (prex != -1 && prey != -1 && !end[x][y]){
                    g.drawLine(prex, prey, x, y);                                               
                }
                prex = x;
                prey = y;
            }
        }
    }

}

1 Ответ

2 голосов
/ 17 ноября 2011

(я думаю, что это домашнее задание? Если так, пожалуйста, пометьте его как домашнее задание)

Могу поспорить, что никто не будет ясно знать, что вы подразумеваете под "не правильно рисовать".В любом случае, я вижу одну из проблем.

Могу поспорить, что вы храните только 1 строку.Однако способ хранения и рисования проблематичен.

Вы сохранили координаты, которые «пропустила» мышь, отметив координаты на «виртуальном экране».Однако, когда вы рисуете это на экране, вы не следуете порядку, пройденному мышью.Вместо этого вы рисуете линии в порядке сверху вниз, слева направо, что просто создает беспорядок.

Возможно, вы захотите сохранить список координат, а когда вы рисуете, вы рисуете согласнокоордината.

Псевдокод:

class Coordinate {  // there are some class in Java that already does that, 
                    //leave it to you to find out  :)
  int x;
  int y;
}

List<Coordinate> theOnlyLine=....;
public void mouseDragged(MouseEvent m) {
    theOnlyLine.add(new Coordinate(m.getX(), m.getY());
}

public void mouseReleased(MouseEvent e) {
    theOnlyLine.add(new Coordinate(m.getX(), m.getY());
}

public void paint(Graphics g) {

  int prevX = -1;
  int prevY = -1;
  for (Coordinate coordinate : theOnlyLine) {
    if (prevX > 0 && prevY > 0) {
      g.drawLine(prevX, prevY, coordinate.getX(), coordinate.getY());
    }
    prevX = coordinate.getX();
    prevY = coordinate.getY();
  }
}
...