Spring.
Spring.
Click, drag, and release the horizontal bar to start the spring.
// Spring drawing constants for top bar
int springHeight = 32; // Height
int left; // Left position
int right; // Right position
int max = 200; // Maximum Y value
int min = 100; // Minimum Y value
boolean over = false; // If mouse over
boolean move = false; // If mouse down and over
// Spring simulation constants
float M = 0.8; // Mass
float K = 0.2; // Spring constant
float D = 0.92; // Damping
float R = 150; // Rest position
// Spring simulation variables
float ps = R; // Position
float vs = 0.0; // Velocity
float as = 0; // Acceleration
float f = 0; // Force
void setup() {
size(640, 360);
rectMode(CORNERS);
noStroke();
left = width/2 - 100;
right = width/2 + 100;
}
void draw() {
background(102);
updateSpring();
drawSpring();
}
void drawSpring() {
// Draw base
fill(0.2);
float baseWidth = 0.5 * ps + -8;
rect(width/2 - baseWidth, ps + springHeight, width/2 + baseWidth, height);
// Set color and draw top bar
if(over || move) {
fill(255);
} else {
fill(204);
}
rect(left, ps, right, ps + springHeight);
}
void updateSpring() {
// Update the spring position
if(!move) {
f = -K * (ps - R); // f=-ky
as = f / M; // Set the acceleration, f=ma == a=f/m
vs = D * (vs + as); // Set the velocity
ps = ps + vs; // Updated position
}
if(abs(vs) < 0.1) {
vs = 0.0;
}
// Test if mouse is over the top bar
if(mouseX > left && mouseX < right && mouseY > ps && mouseY < ps + springHeight) {
over = true;
} else {
over = false;
}
// Set and constrain the position of top bar
if(move) {
ps = mouseY - springHeight/2;
ps = constrain(ps, min, max);
}
}
void mousePressed() {
if(over) {
move = true;
}
}
void mouseReleased() {
move = false;
}
Functions Used
rectMode()
Modifies the location from which rectangles are drawn by changing the way in which parameters given to rect() are intepreted
Learn More
mouseReleased()
The mouseReleased() function is called every time a mouse button is released
Learn More
draw()
Called directly after setup(), the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called
Learn More
mousePressed()
The mousePressed() function is called once after every time a mouse button is pressed
Learn More
background()
The background() function sets the color used for the background of the Processing window
Learn More
Learn to Program