像MS paint一样画直线

Drawing straight lines like MS paint

我正在尝试绘制直线(在处理 3.5.4 中),就像在 MS 画图工具中所做的那样(select 通过单击鼠标左键并在释放指针之前拖动指针来获得一个点直线)。我试过使用 mousePressed()mouseReleased() 函数,它创建了直线,但是当我拖动它而不释放它时,它不会在 real-time 中显示直线,这是正常的,因为我'在这种情况下我没有使用 draw() 函数。

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

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

我也尝试在 draw() 函数中实现创建线,这样我就可以得到未释放直线的 real-time 移动,但是这也因为绘制多条直线而失败。

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

I've marked (x1, y1) and (mouseX, mouseY) points as mouse's pressing and releasing points

我正在尝试在 real-time 上实现类似的效果(同时拖动鼠标)。
I've marked the points for the understanding purpose

如果一条线没有画完,那么你要在draw().

中从起点到当前鼠标位置(mouseX, mouseY)画一条线

使用一个ArrayList of PVector对象来存储点:

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

每点击一次鼠标按钮,就在列表中添加一个点:

void mousePressed() {

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

在循环中的点之间画线。如果列表中的点数为奇数,则从最后一个点到当前鼠标位置画一条线:

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);
    }
}

如果你想在点击鼠标时开始画线,松开鼠标时结束画线,那么你必须在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);
    }
}