physics
Class PhysicalEnvironment

java.lang.Object
  extended byphysics.PhysicalEnvironment

public class PhysicalEnvironment
extends java.lang.Object

Diese Klasse führt, bei Aufruf der entsprechenden Methode, einen Simulationschritt durch. Dabei werden zwei unterschiedliche Verfahren zur Berechnung dieses Schrittes angeboten.

Zum einen das ALL_STEP Verfahren: In diesem Modus werden bei jedem Aufruf alle registrierten Objekte bewegt, danach auf Kollisionen geprüft und eventuelle Kollisionsreaktionen durchgeführt. Dies hat den Vorteil, dass sich alle Objekte quasi-gleichzeitig bewegen. Der Nachteil ist, dass ein Simulationsschritt erst beendet ist, wenn alle Objekte abgearbeitet wurden, was bedeutet, dass der Thread, welcher diese Methode aufruft, für unbestimmte Zeit blockiert wird.

Im Simulationsmodus SINGLE_STEP wird versucht das Auftreten dieses Problems zu verringern. Die Berechnung der Bewegung, das Prüfen auf Kollisionen und die daraus resultierende Kollisionsreaktionen werden für jedes Objekt einzeln durchgeführt. Wurde ein Objekt auf diese Weise verarbeitet, wird die verstrichene Zeit überprüft. Übersteigt diese einen festgesetzten Grenzwert, wird die weitere Bearbeitung abgebrochen, so dass der aufrufende Thread mit hoher Wahrscheinlichkeit nicht länger als das vorgegebene Zeitlimit blockiert wird. Beim nächsten Simulationsschritt wird bei dem nächsten noch nicht bearbeiteten Objekt fortgesetzt. Auf diese Weise ist es auch möglich, dass während eines Simulationsschrittes die Körper mehrmals abgearbeitet werden können, was die Genauigkeit der Simulation erhöht.

Version:
1.0 (05/04/25)
Author:
Martin Hedler

Field Summary
static int ALL_STEP
          Für den entsprechenden Simulationsmodus.
static int SINGLE_STEP
          Für den entsprechenden Simulationsmodus.
 
Constructor Summary
PhysicalEnvironment(CollisionHandler ch, int simulationType)
          Erstellt eine Instanz der Klasse mit dem angegebenen CollisionHandler und für den angegebenen Simulationsmodus mit folgenden Werten:
maxDeltaTime = Long.MAX_VALUE,
maxCalculationTime = 20,
defaultEnergyPushFactor = 1.
PhysicalEnvironment(CollisionHandler ch, int type, long maxDeltaTime, long maxCalcTime, float epf)
          Erstellt eine Instanz dieser Klasse mit den angegebenen Werten.
 
Method Summary
 boolean addDynamicTransformGroup(DynamicTransformGroup dynTraGrp)
          Registriert eine DynamicTransformGroup für die Simulation.
 float getDefaultEnergyPushFactor()
          Liefert den Stoßfaktor für Objekte der Szene, mit denen die registrierten Körper zwar kollidieren können, die jedoch selbst keine Instanzen der Klasse DynamicTransformGroup sind, zurück.
 long getMaxCalculationTime()
          Gibt die maximale Berechnungszeit im Modus SINGLE_STEP zurück.
 long getMaxDeltaTime()
          Gibt die maxmale Zeitspanne zurück, die für einen Simulationsschritt verwendet wird.
 void nextStep()
          Führt einen Simulationsschritt durch.
 boolean removeDynamicTransformGroup(DynamicTransformGroup dynTraGrp)
          Entfernt einen Körper aus der Simulation.
 void setDefaultEnergyPushFactor(float value)
          Setzt den Stoßfaktor für Objekte der Szene, mit denen die registrierten Körper zwar kollidieren können, die jedoch selbst keine Instanzen der Klasse DynamicTransformGroup sind.
 void setMaxCalculationTime(long value)
          Setzt die maximale Berechnungszeit im Modus SINGLE_STEP.
 void setMaxDeltaTime(long maxValue)
          Setzt die maximale Zeitspanne, die für einen Simulationsschritt verwendet werden soll.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SINGLE_STEP

public static final int SINGLE_STEP
Für den entsprechenden Simulationsmodus.

See Also:
Constant Field Values

ALL_STEP

public static final int ALL_STEP
Für den entsprechenden Simulationsmodus.

See Also:
Constant Field Values
Constructor Detail

PhysicalEnvironment

public PhysicalEnvironment(CollisionHandler ch,
                           int simulationType)
                    throws java.lang.IllegalArgumentException
Erstellt eine Instanz der Klasse mit dem angegebenen CollisionHandler und für den angegebenen Simulationsmodus mit folgenden Werten:
maxDeltaTime = Long.MAX_VALUE,
maxCalculationTime = 20,
defaultEnergyPushFactor = 1.

Parameters:
ch - Der verwendete CollisionHandler.
simulationType - ALL_STEP oder SINGLE_STEP.
Throws:
java.lang.IllegalArgumentException - Wenn kein gültiger Simulationsmodus angegeben wurde.

PhysicalEnvironment

public PhysicalEnvironment(CollisionHandler ch,
                           int type,
                           long maxDeltaTime,
                           long maxCalcTime,
                           float epf)
                    throws java.lang.IllegalArgumentException
Erstellt eine Instanz dieser Klasse mit den angegebenen Werten.

Parameters:
ch - Der verwendete CollisionHandler.
type - ALL_STEP oder SINGLE_STEP.
maxDeltaTime - Maximale Länge eines Zeitschritts (maxDeltaTime > 0).
maxCalcTime - Maximale Berechnungszeit im Modus SINGLE_STEP (maxCalcTime > 0).
epf - Stoßfaktor für Objekte der Szene, mit denen die registrierten Körper zwar kollidieren können, die jedoch selbst keine Instanzen der Klasse DynamicTransformGroup sind (0 >= epf >= 1).
Throws:
java.lang.IllegalArgumentException - Wenn einer der Parameter ungültig ist.
Method Detail

setDefaultEnergyPushFactor

public void setDefaultEnergyPushFactor(float value)
                                throws java.lang.IllegalArgumentException
Setzt den Stoßfaktor für Objekte der Szene, mit denen die registrierten Körper zwar kollidieren können, die jedoch selbst keine Instanzen der Klasse DynamicTransformGroup sind.

Parameters:
value - Ein Wert zwischen 0 und 1.
Throws:
java.lang.IllegalArgumentException - Wenn der Stoßfaktor nicht zwischen 0 und 1 liegt.

getDefaultEnergyPushFactor

public float getDefaultEnergyPushFactor()
Liefert den Stoßfaktor für Objekte der Szene, mit denen die registrierten Körper zwar kollidieren können, die jedoch selbst keine Instanzen der Klasse DynamicTransformGroup sind, zurück.

Returns:
Der Stoßfaktor.

addDynamicTransformGroup

public boolean addDynamicTransformGroup(DynamicTransformGroup dynTraGrp)
Registriert eine DynamicTransformGroup für die Simulation.

Parameters:
dynTraGrp - Die zu registrierende DynamicTransformGroup.
Returns:
true, wenn der Körper erfolgreich registriert wurde, sonst false.

removeDynamicTransformGroup

public boolean removeDynamicTransformGroup(DynamicTransformGroup dynTraGrp)
Entfernt einen Körper aus der Simulation.

Parameters:
dynTraGrp - Der zu entfernende Körper.
Returns:
true, wenn der Körper erfolgreich entfernt wurde, sonst false.

setMaxDeltaTime

public void setMaxDeltaTime(long maxValue)
                     throws java.lang.IllegalArgumentException
Setzt die maximale Zeitspanne, die für einen Simulationsschritt verwendet werden soll.

Parameters:
maxValue - Die maximale Zeitspanne.
Throws:
java.lang.IllegalArgumentException - Wenn der angegebene Wert kleiner gleich 0 ist.

getMaxDeltaTime

public long getMaxDeltaTime()
Gibt die maxmale Zeitspanne zurück, die für einen Simulationsschritt verwendet wird.

Returns:
Die maximale Zeitspanne.

setMaxCalculationTime

public void setMaxCalculationTime(long value)
Setzt die maximale Berechnungszeit im Modus SINGLE_STEP.

Parameters:
value - Die maximale Berechnungsdauer.

getMaxCalculationTime

public long getMaxCalculationTime()
Gibt die maximale Berechnungszeit im Modus SINGLE_STEP zurück.

Returns:
Die maximale Berechnungsdauer.

nextStep

public void nextStep()
Führt einen Simulationsschritt durch. Je nach angegebenen Simulationsmodus werden alle Körper gleichzeitig bewegt und auf Kollisionen geprüft oder jeweils einzeln hintereinander.

Zur Berechnung der Bewegung wird die seit dem letzten Aufruf der Methode vergangene Zeit herangezogen. Übersteigt diese jedoch maxDeltaTime, so wird maxDeltaTime genutzt.