public void zeichneFigur()
{
double lHMin, lHMax, lVMin, lVMax, lX0, lY0;
hatBildschirm.loescheAlles();
// Zeichnung zunaechst nur abfahren, dabei Dimension der Zeichnung merken
zProbelauf = true;
hatStift.hoch();
hatStift.bewegeBis(0, 0);
zHMin = 0;
zHMax = 0;
zVMin = 0;
zVMax = 0;
zSchritt = 1;
zeichneAxiom();
zProbelauf = false;
lHMin = 5; // Rand
lHMax = this.bildschirm().breite() - 5;
lVMin = 5;
lVMax = this.bildschirm().hoehe() - 5;
if((lHMax - lHMin) / (zHMax - zHMin) > (lVMax - lVMin) / (zVMax - zVMin))
{
// links und rechts im Zeichnungsfenster bleibt ein Streifen frei
zSchritt = (lVMax - lVMin) / (zVMax - zVMin);
lHMin = lHMin + ((lHMax - lHMin) - (zHMax - zHMin) * zSchritt) / 2.0;
lHMax = lHMin + (zHMax - zHMin);
}
else
{
// oben und unten im Zeichnungsfenster bleibt ein Streifen frei
zSchritt = (lHMax - lHMin) / (zHMax - zHMin);
lVMin = lVMin + ((lVMax - lVMin) - (zVMax - zVMin) * zSchritt) / 2.0;
lVMax = lVMin + (zVMax - zVMin);
}
lX0 = lHMin - zSchritt * zHMin; // zHMin ist <= 0 !
lY0 = lVMin - zSchritt * zVMin; // zVMin ist <= 0 !
hatStift.bewegeBis(lX0, lY0);
hatStift.runter();
zeichneAxiom();
}
private void zeichneAxiom()
{
int lPosition;
lPosition = 1;
hatStift.dreheBis(90);
while(lPosition <= hatTW.laenge(lAxiom))
{
switch(hatTW.zeichenAn(lAxiom, lPosition))
{
case 'F':
if(zIterationsTiefe == 0)
{
hatStift.bewegeUm(zSchritt);
if(zProbelauf)
{
if(hatStift.hPosition() < zHMin)
zHMin = hatStift.hPosition();
if(hatStift.hPosition() > zHMax)
zHMax = hatStift.hPosition();
if(hatStift.vPosition() < zVMin)
zVMin = hatStift.vPosition();
if(hatStift.vPosition() > zVMax)
zVMax = hatStift.vPosition();
}
}
else
zeichneRekursiv(zIterationsTiefe - 1);
break;
case '+':
hatStift.dreheUm(zWinkel);
break;
case '-':
hatStift.dreheUm(-zWinkel);
break;
case '[':
hatStapel.legeAuf(new Stiftzustand(hatStift));
break;
case ']':
((Stiftzustand)hatStapel.oberstes()).wiederherstellen(hatStift);
hatStapel.entferneOberstes();
break;
}
lPosition++;
}
hatStift.hoch();
}
private void zeichneRekursiv(int pIterationsTiefe)
{
int lPosition;
lPosition = 1;
while(lPosition <= hatTW.laenge(zErsetzung))
{
switch(hatTW.zeichenAn(zErsetzung, lPosition))
{
case 'F':
if(pIterationsTiefe == 0)
{
hatStift.bewegeUm(zSchritt);
if(zProbelauf)
{
if(hatStift.hPosition() < zHMin)
zHMin = hatStift.hPosition();
if(hatStift.hPosition() > zHMax)
zHMax = hatStift.hPosition();
if(hatStift.vPosition() < zVMin)
zVMin = hatStift.vPosition();
if(hatStift.vPosition() > zVMax)
zVMax = hatStift.vPosition();
}
}
else
zeichneRekursiv(pIterationsTiefe - 1);
break;
case '+':
hatStift.dreheUm(zWinkel);
break;
case '-':
hatStift.dreheUm(-zWinkel);
break;
case '[':
hatStapel.legeAuf(new Stiftzustand(hatStift));
break;
case ']':
((Stiftzustand)hatStapel.oberstes()).wiederherstellen(hatStift);
hatStapel.entferneOberstes();
break;
}
lPosition++;
}
}
|