71 lines
1.9 KiB
Plaintext
71 lines
1.9 KiB
Plaintext
|
|
import processing.opengl.*;
|
||
|
|
|
||
|
|
import mathematik.*;
|
||
|
|
|
||
|
|
import teilchen.Particle;
|
||
|
|
import teilchen.Physics;
|
||
|
|
import teilchen.force.Spring;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* this sketch shows
|
||
|
|
* 1 how to create a viscous drag to slow motion eventually down.
|
||
|
|
* 2 how to create a spring that connects two particles.
|
||
|
|
*/
|
||
|
|
|
||
|
|
Physics mPhysics;
|
||
|
|
|
||
|
|
Particle mRoot;
|
||
|
|
|
||
|
|
void setup() {
|
||
|
|
size(640, 480, OPENGL);
|
||
|
|
smooth();
|
||
|
|
frameRate(30);
|
||
|
|
|
||
|
|
/* create a particle system */
|
||
|
|
mPhysics = new Physics();
|
||
|
|
|
||
|
|
/* create a particle to which we will connect springs */
|
||
|
|
mRoot = mPhysics.makeParticle(width / 2, height / 2, 0.0);
|
||
|
|
/* we give the root particle a higher mass so it doesn t move as easily */
|
||
|
|
mRoot.mass(30);
|
||
|
|
}
|
||
|
|
|
||
|
|
void draw() {
|
||
|
|
/* create a particle at mouse position and connect it to the root particle through a spring */
|
||
|
|
if (mousePressed) {
|
||
|
|
Particle mParticle = mPhysics.makeParticle(mouseX, mouseY, 0);
|
||
|
|
Spring mSpring = mPhysics.makeSpring(mRoot, mParticle);
|
||
|
|
/* restlength defines the desired length of the spring. in this case it is the distance between the two particles. */
|
||
|
|
float mRestlength = mSpring.restlength();
|
||
|
|
/* we modify the restlength to add a bit of energy into the system */
|
||
|
|
mSpring.restlength(mRestlength * 1.5f);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* update the particle system */
|
||
|
|
final float mDeltaTime = 1.0 / frameRate;
|
||
|
|
mPhysics.step(mDeltaTime);
|
||
|
|
|
||
|
|
/* draw particles and connecting line */
|
||
|
|
background(255);
|
||
|
|
|
||
|
|
/* draw springs */
|
||
|
|
noFill();
|
||
|
|
stroke(255, 0, 127, 64);
|
||
|
|
for (int i = 0; i < mPhysics.forces().size(); i++) {
|
||
|
|
if (mPhysics.forces().get(i) instanceof Spring) {
|
||
|
|
Spring mSSpring = (Spring)mPhysics.forces().get(i);
|
||
|
|
line(mSSpring.a().position().x, mSSpring.a().position().y,
|
||
|
|
mSSpring.b().position().x, mSSpring.b().position().y);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/* draw particles */
|
||
|
|
fill(245);
|
||
|
|
stroke(164);
|
||
|
|
for (int i = 0; i < mPhysics.particles().size(); i++) {
|
||
|
|
ellipse(mPhysics.particles().get(i).position().x,
|
||
|
|
mPhysics.particles().get(i).position().y,
|
||
|
|
12, 12);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|