Простое рисование линий

Я пытаюсь сделать простую программу рисования линий в 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;
            }
        }
    }

}

person Neutralise    schedule 17.11.2011    source источник
comment
1) Чтобы быстрее получить помощь, опубликуйте SSCCE. 2) рисует неправильно Что такое "правильно"? Что вы видите? Что вы ожидаете увидеть?   -  person Andrew Thompson    schedule 17.11.2011
comment
prey интересный выбор имени переменной. Где объявлено predator?   -  person Andrew Thompson    schedule 17.11.2011
comment
prey = предшественник y, четко определенный выше. Я ожидаю, что он рисует линии между перетаскиваемыми точками, но рисует «произвольно» соединенные точки.   -  person Neutralise    schedule 17.11.2011


Ответы (1)


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

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

Бьюсь об заклад, вы храните только 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();
  }
}
person Adrian Shum    schedule 17.11.2011
comment
Да это я тоже узнал. Я надеялся сделать это с помощью «виртуального экрана», потому что это значительно упрощает заливку. Это повторение к экзамену, а не домашнее задание. Спасибо. - person Neutralise; 17.11.2011
comment
Я не занимался разработкой графического интерфейса, но если вы создаете этот виртуальный экран, я предлагаю вам обратить внимание на двойную буферизацию, для которой это «виртуальный экран» с использованием графического контекста. Я думаю, что это не сложнее, чем двумерный массив. - person Adrian Shum; 17.11.2011