147 lines
3.3 KiB
Plaintext
Raw Normal View History

2015-03-04 09:41:41 +01:00
import mathematik.*;
import teilchen.test.cubicle.*;
import teilchen.integration.*;
import verhalten.*;
import teilchen.*;
import verhalten.view.*;
import teilchen.test.particle.behavior.*;
import teilchen.behavior.*;
import teilchen.demo.*;
import teilchen.test.particle.springs.*;
import teilchen.gestalt.test.*;
import teilchen.cubicle.*;
import verhalten.test.*;
import teilchen.force.flowfield.*;
import teilchen.test.particle.*;
import teilchen.gestalt.util.*;
import teilchen.constraint.*;
import teilchen.force.vectorfield.*;
import teilchen.force.*;
import teilchen.util.*;
import mathematik.*;
import teilchen.Physics;
import teilchen.force.Attractor;
import teilchen.force.Gravity;
import teilchen.force.Spring;
import teilchen.force.ViscousDrag;
import teilchen.integration.RungeKutta;
import teilchen.util.Overlap;
import teilchen.util.StickMan;
/**
* this demo shows some advanced use of particles, springs and attractors to create stickmen.
*/
Physics mPhysics;
Attractor mAttractor;
Gravity mGravity;
ViscousDrag mViscousDrag;
StickMan[] mMyStickMan;
void setup() {
size(640, 480, OPENGL);
smooth();
frameRate(60);
noFill();
mPhysics = new Physics();
mPhysics.setInegratorRef(new RungeKutta());
mGravity = new Gravity();
mGravity.force().y = 20;
mPhysics.add(mGravity);
mViscousDrag = new ViscousDrag();
mViscousDrag.coefficient = 0.85f;
mPhysics.add(mViscousDrag);
mAttractor = new Attractor();
mAttractor.radius(500);
mAttractor.strength(0);
mAttractor.position().set(width / 2, height / 2);
mPhysics.add(mAttractor);
mMyStickMan = new StickMan[20];
for (int i = 0; i < mMyStickMan.length; i++) {
mMyStickMan[i] = new StickMan(mPhysics, random(0, width), random(0.3f, 0.6f));
}
}
void draw() {
mPhysics.step(1f / 60f);
Overlap.resolveOverlap(mPhysics.particles());
/* constraint particles */
for (int i = 0; i < mPhysics.particles().size(); i++) {
if (mPhysics.particles(i).position().y > height - 10) {
mPhysics.particles(i).position().y = height - 10;
}
if (mPhysics.particles(i).position().x > width) {
mPhysics.particles(i).position().x = width;
}
if (mPhysics.particles(i).position().x < 0) {
mPhysics.particles(i).position().x = 0;
}
}
/* handle particles */
if (mousePressed) {
mAttractor.position().set(mouseX, mouseY);
if (mouseButton == RIGHT) {
mAttractor.strength(-500);
mAttractor.radius(500);
}
else {
mAttractor.strength(500);
mAttractor.radius(100);
}
}
else {
mAttractor.strength(0);
}
if (keyPressed) {
mGravity.force().y = -10;
}
else {
mGravity.force().y = 20;
}
/* draw */
background(255);
/* draw springs */
stroke(0, 20);
for (int i = 0; i < mPhysics.forces().size(); i++) {
if (mPhysics.forces(i) instanceof Spring) {
Spring mySpring = (Spring)mPhysics.forces(i);
line(mySpring.a().position().x,
mySpring.a().position().y,
mySpring.b().position().x,
mySpring.b().position().y);
}
}
/* draw particles */
for (int i = 0; i < mPhysics.particles().size(); i++) {
ellipse(mPhysics.particles(i).position().x,
mPhysics.particles(i).position().y, 5, 5);
}
/* draw man */
for (int i = 0; i < mMyStickMan.length; i++) {
mMyStickMan[i].draw(g);
}
}