mirror of
https://github.com/jneug/zeichenmaschine.git
synced 2026-10-12 09:56:33 +02:00
Beispiel zu Anziehungskräften vervollständigt
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user