Beispiel zu Anziehungskräften vervollständigt

This commit is contained in:
ngb
2022-01-04 11:42:02 +01:00
parent ee3c85d6eb
commit ba90f7d041
4 changed files with 455 additions and 95 deletions

View File

@@ -1,50 +1,91 @@
import schule.ngb.zm.Vector;
import schule.ngb.zm.Zeichenmaschine;
import java.util.LinkedList;
import schule.ngb.zm.*;
/**
* Hauptklasse der Simulation.
*/
public class Gravity extends Zeichenmaschine {
public static final int G = 1;
private LinkedList<Mover> movers = new LinkedList<>();
private LinkedList<Attractor> attractors = new LinkedList<>();
public void setup(){
for( int i = 0; i < 10; i++ ) {
Mover m = new Mover(random(10, width-10), random(10, height-10));
movers.add(m);
shapes.add(m);
}
attractors.add(new Attractor(width/2, height/2, 10));
shapes.add(attractors.get(0));
}
public void update( double delta ) {
Attractor mouseFollow = attractors.get(0);
mouseFollow.moveTo(mouseX, mouseY);
for( Attractor a: attractors ) {
for( Mover m: movers ) {
a.attract(m);
}
}
for( Mover m: movers ) {
m.update(delta);
}
shapes.clear();
}
public void mouseClicked() {
for( Mover m: movers ) {
m.moveTo(random(10, width-10), random(10, height-10));
m.setVelocity(0, 0);
}
}
/**
* Liste der beweglichen Objekte in der Welt.
*/
private LinkedList<Mover> movers = new LinkedList<>();
private final Vector gravity = new Vector(0, 6.734);
/**
* Erstellt die {@link Mover}-Objekte.
*/
public void setup() {
for( int i = 0; i < 4; i++ ) {
//Mover m = new Mover(random(10, width - 10), 30);
Mover m = new Mover(10 + (i*30), 30, 5*(i+1));
movers.add(m);
shapes.add(m);
}
}
/**
* Aktualisiert die Beschleunigung der {@link Mover}-Objekte durch Anwenden
* der einwirkenden Kräfte und aktualisiert dann die Position entsprechend
* der Beschleunigung.
* <p>
* Die Position des ersten {@link Attractor} wird auf die Mausposition
* gesetzt.
*
* @param delta
*/
public void update( double delta ) {
// Kräfte anwenden
for( Mover m : movers ) {
if( m.isActive() ) {
m.applyForce(gravity);
}
}
// Position aktualisieren
for( Mover m : movers ) {
if( m.isActive() ) {
m.update(delta);
// Abprallen Boden
if( m.getY() >= height ) {
m.setY(height-1);
m.getVelocity().y *= -1;
double s = 9.0 / m.getMass();
m.getVelocity().scale(limit(s, 0.0, 1.0));
}
// Abprallen rechter Rand
if( m.getX() >= width ) {
m.setX(width-1);
m.getVelocity().x *= -1;
}
// Abprallen linker Rand
if( m.getX() <= 0) {
m.setX(1);
m.getVelocity().x *= -1;
}
}
}
}
/**
* Setzt die Position und Beschleunigung aller {@link Mover}-Objekte in der
* Welt zurück.
*/
public void mouseClicked() {
for( Mover m : movers ) {
m.moveTo(random(10, width - 10), 30);
m.setVelocity(mouseX-m.getX(), mouseY-m.getY());
m.getVelocity().setLen(4.0);
}
}
public static void main( String[] args ) {
new Gravity();
}
}