mirror of
https://github.com/processing/processing4.git
synced 2026-01-29 11:21:06 +01:00
69 lines
1.3 KiB
Plaintext
69 lines
1.3 KiB
Plaintext
/**
|
|
* Chain.
|
|
*
|
|
* One mass is attached to the mouse position and the other
|
|
* is attached the position of the other mass. The gravity
|
|
* in the environment pulls down on both.
|
|
*/
|
|
|
|
|
|
Spring2D s1, s2;
|
|
|
|
float gravity = 9.0;
|
|
float mass = 2.0;
|
|
|
|
void setup()
|
|
{
|
|
size(640, 360);
|
|
smooth();
|
|
fill(255, 126);
|
|
// Inputs: x, y, mass, gravity
|
|
s1 = new Spring2D(0.0, width/2, mass, gravity);
|
|
s2 = new Spring2D(0.0, width/2, mass, gravity);
|
|
}
|
|
|
|
void draw()
|
|
{
|
|
background(0);
|
|
s1.update(mouseX, mouseY);
|
|
s1.display(mouseX, mouseY);
|
|
s2.update(s1.x, s1.y);
|
|
s2.display(s1.x, s1.y);
|
|
}
|
|
|
|
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 = 30;
|
|
float stiffness = 0.2;
|
|
float damping = 0.7;
|
|
|
|
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) {
|
|
noStroke();
|
|
ellipse(x, y, radius*2, radius*2);
|
|
stroke(255);
|
|
line(x, y, nx, ny);
|
|
}
|
|
}
|