/*
* Datei: GrundDynamik.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Erstellt: 20.05.2009
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.umgebung2D.dynWaende;
import java.util.LinkedList;
import java.util.Random;
import fmg.fmg8.statistik.Parametersatz;
import fmg.fmg8.umgebung2D.Umgebung;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
* @author Lukas K�nig
*/
public class GrundDynamik implements Dynamik {
/**
* Standardkonstruktor.
*
* @param rand Zufallsgenerator.
*/
public GrundDynamik(final Random rand) {
super();
this.random = rand;
}
/**
* Zufallsgenerator.
*/
private Random random;
/**
* Die Nummern der dynamischen W�nde.
*/
private LinkedList<Integer> waende;
/**
* Die Drehrichtungen der dynamischen W�nde.
*/
private LinkedList<Boolean> drehen;
/**
* Die Verschiebungsrichtungen der dynamischen W�nde.
*/
private LinkedList<Boolean> versch;
/**
* Die Verzerrungsrichtungen der dynamischen W�nde.
*/
private LinkedList<Boolean> verzerr;
/**
* Drehwinkel.
*/
private LinkedList<Double> winkel;
/**
* Verschiebung.
*/
private LinkedList<Double> xRicht;
/**
* Verschiebung.
*/
private LinkedList<Double> yRicht;
/**
* F�hrt die Verschiebung, Verzerrung, Rotation... von W�nden in der
* �bergebenen Umgebung durch. VOR der Umschaltung in Simulationsmodus.
*
* @param umg Die Umgebung, in der die Ver�nderungen stattfinden sollen.
* @param simZyk Der aktuelle Simulationszyklus.
* @param params Die Parameter.
*/
@Override
public void verschVorUm(
final Umgebung umg,
final long simZyk,
final Parametersatz params) {
if (this.waende == null) {
this.waende = new LinkedList<Integer>();
this.drehen = new LinkedList<Boolean>();
this.versch = new LinkedList<Boolean>();
this.verzerr = new LinkedList<Boolean>();
this.winkel = new LinkedList<Double>();
this.xRicht = new LinkedList<Double>();
this.yRicht = new LinkedList<Double>();
for (int i = 0; i < umg.getDynWaende().length; i++) {
if (umg.getDynWaende()[i] != null) {
this.waende.add(i);
this.drehen.add(true);
this.versch.add(true);
this.verzerr.add(true);
this.winkel.add(this.random.nextDouble() * 0.5);
this.xRicht.add(this.random.nextDouble() * 0.5);
this.yRicht.add(this.random.nextDouble() * 0.5);
}
}
}
for (int i = 0; i < this.waende.size(); i++) {
if (this.drehen.get(i)) {
if (null != umg.dreheWand(
this.waende.get(i),
umg.getDynDrehWinkel()[this.waende.get(i)]
* 180 / Math.PI
+ this.winkel.get(i))) {
this.drehen.set(i, !this.drehen.get(i));
this.winkel.set(i, this.random.nextDouble() * 0.5);
}
} else {
if (null != umg.dreheWand(
this.waende.get(i),
umg.getDynDrehWinkel()[this.waende.get(i)]
* 180 / Math.PI
- this.winkel.get(i))) {
this.drehen.set(i, !this.drehen.get(i));
this.winkel.set(i, this.random.nextDouble() * 0.5);
}
}
if (this.versch.get(i)) {
Vektor2D vSchiebg = umg.getDynVersch()[this.waende.get(i)];
vSchiebg.add(new Vektor2D(
this.xRicht.get(i),
this.yRicht.get(i)));
if (null != umg.verschWand(
this.waende.get(i),
vSchiebg)) {
this.versch.set(i, !this.versch.get(i));
this.xRicht.set(i, this.random.nextDouble() * 0.5);
this.yRicht.set(i, this.random.nextDouble() * 0.5);
}
} else {
Vektor2D vSchiebg = umg.getDynVersch()[this.waende.get(i)];
vSchiebg.add(new Vektor2D(
-this.xRicht.get(i),
-this.yRicht.get(i)));
if (null != umg.verschWand(
this.waende.get(i),
vSchiebg)) {
this.versch.set(i, !this.versch.get(i));
this.xRicht.set(i, this.random.nextDouble() * 0.5);
this.yRicht.set(i, this.random.nextDouble() * 0.5);
}
}
// if (this.verzerr.get(i)) {
// Vektor2D verz = new Vektor2D(
// umg.getDynHorFaktor()[this.waende.get(i)],
// umg.getDynVertFaktor()[this.waende.get(i)]);
// verz.div(1.01);
//
// if (umg.getDynHorFaktor()[this.waende.get(i)] < 0.05
// || !umg.verzerrWand(
// this.waende.get(i),
// verz.x,
// verz.y)) {
// this.verzerr.set(i, !this.verzerr.get(i));
// }
// } else {
// Vektor2D verz = new Vektor2D(
// umg.getDynHorFaktor()[this.waende.get(i)],
// umg.getDynVertFaktor()[this.waende.get(i)]);
// verz.mult(1.01);
//
// if (!umg.verzerrWand(
// this.waende.get(i),
// verz.x,
// verz.y)) {
// this.verzerr.set(i, !this.verzerr.get(i));
// }
// }
}
}
/**
* F�hrt die Verschiebung, Verzerrung, Rotation... von W�nden in der
* �bergebenen Umgebung durch. NACH der Umschaltung in Simulationsmodus.
* Es wird einfach die Methode VOR Umschaltung aufgerufen.
*
* @param umg Die Umgebung, in der die Ver�nderungen stattfinden sollen.
* @param simZyk Der aktuelle Simulationszyklus.
* @param params Die Parameter.
*/
@Override
public void verschNachUm(
final Umgebung umg,
final long simZyk,
final Parametersatz params) {
this.verschVorUm(umg, simZyk, params);
}
}