在Processing 3.0中使用缓动鼠标绘图

时间:2016-06-21 21:15:39

标签: javascript drawing mouseevent processing

我试图在线条this的帮助下创建一个平滑的绘图工具。 我完成了基础知识,但我的代码有几个问题。

这是我正在处理的草图的代码:

  Spring2D s1;

float gravity = 0;
float mass = 4.0;

void setup() {
  frameRate(60);
  size(640, 360);
  fill(255, 126);
  // Inputs: x, y, mass, gravity
  s1 = new Spring2D(0.0, width/2, mass, gravity);
  }

void draw() {
  s1.display(mouseX, mouseY);
  s1.update(mouseX, mouseY);
  }

class Spring2D {
  float vx, vy; // The x- and y-axis velocities
  float x, y; // The x- and y-coordinates
  float gravity;
  float mass;
  float radius = 10;
  float stiffness = 0.7;
  float damping = 0.5;

  Spring2D(float xpos, float ypos, float m, float g) {
    x = xpos;
    y = ypos;
    mass = m;
    gravity = g;
  }

  void update(float targetX, float targetY) {
    float forceX = (targetX - x) * stiffness;
    float ax = forceX / mass;
    vx = damping * (vx + ax);
    x += vx;
    float forceY = (targetY - y) * stiffness;
    forceY += gravity;
    float ay = forceY / mass;
    vy = damping * (vy + ay);
    y += vy; 
  }

  void display(float nx, float ny) {
   if (mousePressed == true) {

    background(0);

    stroke(40, 255, 150);
    line(x, y, nx, ny);


    noStroke();
    fill(255, 130, 40);
    ellipse(x, y, 5, 5);

  } else  {
   background(0);
   }
  }
}

我使用绿色绳子(线条)作为指导,这样它就能产生弹性摩擦力以平滑地绘制。它仅在单击画布时出现,并在释放鼠标时消失。我想要橙色点来绘制(x,y,nx,ny),而不是我的鼠标坐标。 (在这种情况下,不是球体,而是如建议的连续线条)。

问题是,当我没有将背景设置为某种颜色(此处为0;这是黑色)时,引导字符串(绿线和橙色点)也将自己绘制到画布上。但是,我喜欢将它们仅用作指导,作为帮助者。那么,如何在不绘制字符串的情况下根据橙色点绘制线条呢?

1 个答案:

答案 0 :(得分:1)

即使您的帧速率非常高,您的鼠标也不会真正通过屏幕上的每个像素。它一次移动多个像素,具体取决于移动鼠标的速度。因此,在帧之间,鼠标可以从一个位置移动到另一个位置,而不会移动到这两个位置之间的每个位置。

要解决这个问题,您可以在当前位置绘制一条椭圆,而不是在前一个位置绘制线条。

Spring2D课程中,您必须跟踪之前的位置。你可以使用两个变量:

float previousX;
float previousY;

您需要在update()函数中更新这些变量。

previousX = x;
previousY = y;

然后在display()函数中,您需要使用这些变量绘制从前一点到当前点的一条线:

strokeWeight(radius*2);
line(previousX, previousY, x, y);

这样可以防止你看到的点之间的空格。

如果您有任何其他问题,请在自己的帖子中将其作为单独的问题发布。尝试将您的问题缩小到关于特定代码行的特定问题,或尽可能少的行。很难回答一般的“我该怎么做”这类问题。 Stack Overflow专为更具体的“我试过X,期望Y,但得到Z而不是”类型问题而设计。如果你想要更具体,你会有更好的运气(和更快的响应时间)。祝你好运,这似乎是一个有趣的项目。