Search code examples
javaanimationprocessinglerp

Animating Circle to Move Across Line


I'm using the lerp() function to move my circle across a line, but it isn't working. The circle always ends up on the line somewhere depending on what my amt parameter is for the lerp() function. If I put 0.5 for the amt then the circle is placed half way down the line, but I can't see it move nor does the circle finish moving down the length of the circle. So can anyone help me make the circle move down the line?

float x1,y1,x2,y2;
float cx,cy;
float x4,y4;

void setup() {
  size(600,600);
  x1 = 200;
  y1 = 150;
  x2 = 300;
  y2 = 250;
  cx = 450;
  cy = 200;
}

void draw() { 
  background(60);
  stroke(220);
  line(x1,y1,x2,y2);
  noFill();
  noStroke();
  // calculate the point
  float k = ((y2-y1) * (cx-x1) - (x2-x1) * (cy-y1))
   / ((y2-y1)*(y2-y1) + (x2-x1)*(x2-x1));
  float x4 = cx - k * (y2-y1);
  float y4 = cy + k * (x2-x1);
  stroke(0);
  line(cx,cy,x4,y4); //line connecting circle and point on line

  float x = lerp(cx, x4, .1);
  float y = lerp(cy, y4, .1);

  fill(255, 0, 175);
  ellipse(x4,y4, 8,8);

  fill(175, 0, 255);
  ellipse(x, y, 50, 50);
}

Solution

  • You need to use a variable for the amount value passed into the lerp() function. Then just increase that variable over time to animate:

    float amount = 0;
    float speed = .001;
    
    void setup() {
      size(500, 500);
    }
    
    void draw() {
    
      float startX = 0;
      float startY = 0;
      float endX = width;
      float endY = height;
      float currentX = lerp(startX, endX, amount);
      float currentY = lerp(startY, endY, amount);
    
      background(0);
      ellipse(currentX, currentY, 20, 20);
    
      amount += speed;
    
    }