/*
* Datei: ZahnradDynamikEineDrehung.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Erstellt: 25.08.2009
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.umgebung2D.dynWaende;
import fmg.fmg8.sonstiges.SonstMeth;
import fmg.fmg8.statistik.Parametersatz;
import fmg.fmg8.umgebung2D.Roboter;
import fmg.fmg8.umgebung2D.Umgebung;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
* @author Lukas K�nig
*/
public class KreuzDynamik implements Dynamik {
/**
* Die Anzahl der Messungen, bei denen ein Roboter n�her am linken
* Zahnrad war.
*/
private long anzahlLinksAnf = 1;
/**
* Die Anzahl der Messungen, bei denen ein Roboter n�her am rechten
* Zahnrad war.
*/
private long anzahlRechtsAnf = 1;
/**
* Die Anzahl der Messungen, bei denen ein Roboter n�her am linken
* Zahnrad war.
*/
private long anzahlLinksEnd = 1;
/**
* Die Anzahl der Messungen, bei denen ein Roboter n�her am rechten
* Zahnrad war.
*/
private long anzahlRechtsEnd = 1;
/**
* Drehwinkel des einen Kreuzes.
*/
final double drehWinkel1 = 0.05;
/**
* Drehwinkel des anderen Kreuzes.
*/
final double drehWinkel2 = 1.5;
/**
*
*/
private double geschw = 2;
/**
* Die Verschiebe-Methode, die das linke obere Zahnrad in der
* Zahnradumgebung dreht. Das rechte untere Zahnrad wird nur auf
* einen konstanten Winkel gedreht.
*
* @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.geschw <= 2) {
this.geschw -= 0.01;
}
// umg.setDynDrehMittPkt(
// 221,
// new Vektor2D(
// umg.getDynDrehMittPkte()[221].x - 1,
// umg.getDynDrehMittPkte()[221].y));
//
//// umg.verzerrWand(221, Math.abs(this.geschw) / 2, 1);
umg.dreheWand(
221,
umg.getDynDrehWinkel()[221] * 180 / Math.PI - drehWinkel1);
umg.dreheWand(
47,
umg.getDynDrehWinkel()[47] * 180 / Math.PI - drehWinkel2);
}
/**
* 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) {
Vektor2D mitte1, mitte2;
double abstand1, abstand2;
int bef0;
String befehl0;
final int umschCons = 100000;
if (simZyk - umg.getPars().getUmschInSim() == umschCons) {
umg.resetRobs();
}
if (simZyk - umg.getPars().getUmschInSim() <= umschCons) {
umg.dreheWand(
221,
umg.getDynDrehWinkel()[221] * 180 / Math.PI - drehWinkel1);
umg.dreheWand(
47,
umg.getDynDrehWinkel()[47] * 180 / Math.PI - drehWinkel2);
} else {
umg.dreheWand(
221,
umg.getDynDrehWinkel()[221] * 180 / Math.PI - drehWinkel2);
umg.dreheWand(
47,
umg.getDynDrehWinkel()[47] * 180 / Math.PI - drehWinkel1);
}
for (Roboter rob : umg.getAkteure()) {
mitte1 = rob.getUmg().getDynWaende()[47].mittelpunkt();
mitte2 = rob.getUmg().getDynWaende()[221].mittelpunkt();
abstand1 = rob.getPosition().distanz(mitte1);
abstand2 = rob.getPosition().distanz(mitte2);
bef0 = ((Integer) rob.getBefehle().get(0)).intValue();
befehl0 = fmg.fmg8.umgebung2D.Konstanten.BEF[bef0].toUpperCase();
if (befehl0.equals("MOV")) {
if (abstand1 <= abstand2) {
if (simZyk - umg.getPars().getUmschInSim() <= umschCons) {
this.anzahlLinksAnf++;
} else {
this.anzahlLinksEnd++;
}
} else {
if (simZyk - umg.getPars().getUmschInSim() <= umschCons) {
this.anzahlRechtsAnf++;
} else {
this.anzahlRechtsEnd++;
}
}
}
}
if (simZyk % 100 == 0) {
SonstMeth.log(
SonstMeth.LOG_INFO,
"Naeher am linken Zahnrad (Anf.): " + this.anzahlLinksAnf,
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"Naeher am rechten Zahnrad (Anf.): " + this.anzahlRechtsAnf,
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"Prozent rechts (Anf.): "
+ (double) this.anzahlRechtsAnf * 100
/ (double) (this.anzahlLinksAnf + this.anzahlRechtsAnf),
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"Naeher am linken Zahnrad (End.): " + this.anzahlLinksEnd,
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"Naeher am rechten Zahnrad (End.): " + this.anzahlRechtsEnd,
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"Prozent rechts (End.): "
+ (double) this.anzahlRechtsEnd * 100
/ (double) (this.anzahlLinksEnd + this.anzahlRechtsEnd),
umg.getPars());
SonstMeth.log(
SonstMeth.LOG_INFO,
"\n-----------------\n",
umg.getPars(),
"plain",
null);
}
}
}