Рисование прямых линий как краска MS - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь нарисовать прямые линии (при обработке 3.5.4), как это делается в инструменте MS Paint (выберите точку, щелкнув левой кнопкой мыши, и перетащите указатель перед отпусканием, чтобы получить прямую линию). Я попытался использовать функции mousePressed() и mouseReleased(), и он создает прямую линию, но она не показывает прямую линию в реальном времени, когда я перетаскиваю ее, не отпуская, что является нормальным, учитывая, что я не использовал draw() в данном случае это функция.

void mousePressed() {
  x1 = mouseX;
  y1 = mouseY;
}

void mouseReleased() {
  line (x1, y1, mouseX, mouseY);
}

Я также пытался реализовать создание линии внутри функции draw(), чтобы можно было в реальном времени перемещать невыпущенную прямую линию, но это также не удается нарисовать несколько прямых линий.

void draw () {
  if(mousePressed) {
    line (x1, y1, mouseX, mouseY);
  }
}

Я отметил (x1, y1) и (mouseX, mouseY) точки как точки нажатия и отпускания мыши

И я пытаюсь добиться чего-то подобного (перетаскивая мышь) в режиме реального времени.
Я отметил баллы для понимания цели

1 Ответ

2 голосов
/ 28 января 2020

Если линия не закончена, то вы должны нарисовать линию от начальной точки до текущей позиции мыши (mouseX, mouseY) в draw().

Используйте ArrayList из PVector объектов для хранения точек:

ArrayList<PVector> points = new ArrayList<PVector>();

Каждый раз, когда кнопка мыши Нажмите, затем добавьте точку в список:

void mousePressed() {

    points.add(new PVector(mouseX, mouseY));
}

Нарисуйте линии между точками в al oop. Если количество точек в списке нечетное, нарисуйте линию от последней точки до текущей позиции мыши:

for (int i = 0; i < points.size(); i += 2) {

    PVector p1 = points.get(i);
    boolean even = i+1 < points.size();
    PVector p2 = even ? points.get(i+1) : new PVector(mouseX, mouseY);

    line(p1.x, p1.y, p2.x, p2.y);
}

См. Пример:

ArrayList<PVector> points = new ArrayList<PVector>();

void setup() {

    size(500 , 500);
}

void mousePressed() {

    points.add(new PVector(mouseX, mouseY));
}

void draw() {

    background(0);
    stroke(255);

    for (int i = 0; i < points.size(); i += 2) {

        PVector p1 = points.get(i);
        boolean even = i+1 < points.size();
        PVector p2 = even ? points.get(i+1) : new PVector(mouseX, mouseY);

        line(p1.x, p1.y, p2.x, p2.y);
    }
}

Если вы хотите начать рисовать линию, когда мышь нажата, и завершить ее sh, когда мышь отпущена, вам нужно добавить 2-ю точку mouseReleased:

ArrayList<PVector> points = new ArrayList<PVector>();

void setup() {

    size(500 , 500);
}

void mousePressed() {

    points.add(new PVector(mouseX, mouseY));
}

void mouseReleased() {

    points.add(new PVector(mouseX, mouseY));
}

void draw() {

    background(0);
    stroke(255);

    for (int i = 0; i < points.size(); i += 2) {

        PVector p1 = points.get(i);
        boolean even = i+1 < points.size();
        PVector p2 = even ? points.get(i+1) : new PVector(mouseX, mouseY);

        line(p1.x, p1.y, p2.x, p2.y);
    }
}
...