Untitled

 avatar
unknown
plain_text
3 years ago
8.8 kB
25
Indexable
/**
 * Exemplare dieser Klasse veranlassen Turtles dazu,
 * Spuren auf einer Zeichenflaeche zu hinterlassen.
 *
 * @author Axel Schmolitzky
 *         Sebastian Klanck
 *         Tobi
 * @version 2021
 */
class Dompteur
{

    Turtle _Turtle = new Turtle();

    /**
     * 'PR1' auf die Zeichenflaeche zeichnen.
     */
    public void start()
    {
        Turtle turtle = new Turtle(50, 100);

        turtle.drehe(-90);
        turtle.geheVor(60);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(180);

        // Ohne Spur zum naechsten Buchstaben bewegen:
        turtle.hinterlasseKeineSpur();
        turtle.geheZu(100, 100);

        // 'R' zeichnen:
        turtle.hinterlasseSpur();
        turtle.drehe(-90);
        turtle.geheVor(60);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(90);
        turtle.geheVor(30);
        turtle.drehe(180);
        turtle.hinterlasseKeineSpur();
        turtle.geheVor(15);
        turtle.hinterlasseSpur();
        turtle.drehe(60);
        turtle.geheVor(35);

        // Ohne Spur zum naechsten Buchstaben bewegen:
        turtle.hinterlasseKeineSpur();
        turtle.geheZu(170, 100);

        // '1' zeichnen:
        turtle.drehe(-60);
        turtle.hinterlasseSpur();
        turtle.setzeFarbe("rot");
        turtle.drehe(-90);
        turtle.geheVor(60);
        turtle.drehe(-120);
        turtle.geheVor(20);
    }

    /**
     * Die Schildkröte Zeichet ein Muster wo nur noch die Gewünschte Anzahl an Ecken angegeben werden muss.
     *                                                    Angabe sollte größer 0 sein.
     * @param anzahEcken Die Anzahl der Ecken die dein N-Ecken haben soll.
     */
    public void zeichneNEck(int anzahlEcken)
    {  
        this.zeichneNEck(anzahlEcken, 30);
    }

    /**
     * lässt die Schildkröte ein Muster Zeichnen wo nur noch die gewünschte Anzahl der Ecken
     *                                           und kantenlänge übergeben werden muss.
     * @param anzahlEcken Die Anzahl der Ecken die dein N-Ecken haben soll. 
     * @param kantenlaenge Die länge der Kante die die Schildkröte zeichnet.
     */
    public void zeichneNEck(int anzahlEcken, int kantenlaenge)
    {  
        this.zeichneNEck(anzahlEcken, kantenlaenge,"schwarz", _Turtle.gibX(),_Turtle.gibY());
    }

    /**
     * Lässt die Schildkröte ein Muster mit geweünschter Anzahl an Ecken, Farbe der Spurr, länge der Kanten
     *                                  und die Position wo die Schildkröte startet.
     *                                  Angaben sollten größer 0 sein.
     * @param anzahEcken Die Anzahl der Ecken die dein N-Ecken haben soll.
     * @param kantenlaenge Die länge der Kante die die Schildkröte zeichnet.
     * @param farbe Die farbe der Spuren der Schildkröte.
     * @param positionX die X Kordinate der Schildkröte 
     * @param positionY die Y Kordinate der Schildkröte
     */
    public void zeichneNEck(int anzahlEcken, int kantenlänge,String farbe,double positionX, double positionY)
    {   
        Turtle tmpTurtle= new Turtle(positionX, positionY);
        tmpTurtle.drehe(_Turtle.gibRichtung());
        _Turtle.setzeFarbe(farbe);
        for(int i = 0; i < anzahlEcken; i++)
        {
            _Turtle.geheVor(kantenlänge);
            _Turtle.drehe(360/anzahlEcken);
        }
    }  
  
    /**
     * Lässt die Turtle ein Rosette Zeichnen, wo die winkel, kantenlänge und Anzahl der Ecken novh übergeben werden muss.
     *                                                                                  Die Angaben müssen größer 0 sein.
     * @param anzahEcken Die Anzahl der Ecken die dein N-Ecken haben soll.
     * @param kantenlaenge Die länge der Kante die die Schildkröte zeichnet.
     * @param winkel Der Winkel die die N-Ecks von einander abstehen.
     */
    public void rosetteZeichnen(double winkel, int anzahlEcken, int kantenlänge)
    {  
        //erstelle eine Turtle.
        _Turtle = new Turtle(100,100);
        //Winkel um die Sich die Turtle dreht.
        double winkelposition = 0;
        //for Schleife um die Anzahl der 
        for (int k = 0;k <=360/winkel; k++)
        {  
            this.zeichneNEck( anzahlEcken, kantenlänge, "rot", 100, 100);
            winkelposition = winkelposition + winkel;
            _Turtle.drehe(winkelposition);
        }
    }

    /**
     * Zeichnet eine Rosette wo die Winkel, die die N-Ecks abstehen und die Ecken
     *                                     und die Ecken des N-Ecks noch übergeben werden müssen, diese müssen größer 0 sein.
     * @param winkel Der Winkel die die N-Ecks von einander abstehen.
     * @@param anzahEcken Die Anzahl der Ecken die dein N-Ecken haben soll.
     */
    public void rosetteZeichnen(double winkel, int anzahlEcken)
    {  
        this.rosetteZeichnen(winkel, anzahlEcken, 30);
    }

    /**
     * Zeichnet eine Vorgefertige Rosette wo alle angaben wie die Rosette aussieht schon übergeben wurden.
     */
    public void rosetteZeichnen()
    {  
        this.rosetteZeichnen(10, 6, 30);
    }
    
    /**
     * Zeichnet eine Kochkurve mit gewünschter laenge und Detailgrad.
     */
    public void zeichnekochkurve(int detailgrad,double laenge)
    {
        this.zeichneKochkurve(new Turtle(10, 200), laenge , detailgrad);
    }

    /**
     * Zeichnet eine Kochkurve mit gewünschter laenge und Detailgrad.
     * @param turtle die erzeugte Turtle auf einer übergebenen Position die das Bild zeichnet.
     * @param kantenlaenge  die Laenge die die Turtle laufen soll, muss größer 0 sein.
     * @param detailgrad der Detailgrad der in der Kurve auftauchen soll darf nicht kleiner 0 sein.
     */
    public void zeichneKochkurve(Turtle turtle, double laenge, int detailgrad)
    {
        if(laenge <= 0)   // wirft Exception fals Wert kleiner gleich 0 ist.
        {
            throw new IllegalStateException("laenge muss Positiv und größer 0 sein");
        }
        if(detailgrad < 0)      //Wirft Exception fals der Wert kleiner 0 ist.
        {
            throw new IllegalStateException("Detailgrad muss Positiv und größer 0 sein");
        }
        
        if (detailgrad == 0)    //abbruchbedingung sobald Detailgrad 0 ist wird die Turtle was was Zeichnen.
        {       turtle.geheVor(laenge);
        } else 
        {
            zeichneKochkurve(turtle,laenge / 3.0, detailgrad -1);
            turtle.drehe(-60.0);
            zeichneKochkurve(turtle,laenge / 3.0, detailgrad -1);
            turtle.drehe(120.0);
            zeichneKochkurve(turtle,laenge / 3.0, detailgrad -1);
            turtle.drehe(-60.0);
            zeichneKochkurve(turtle,laenge / 3.0, detailgrad -1);
        }
    }

    /**
     * Zeichnet einen Baum mit gewuenschter Anzahl und laenge der Aeste.
     * @param aeste die aAnzahl der Aeste die der Baum haben soll, muss größer 0 sein
     * @param laenge die laenge des Stammes und der Äeste, muss größer 0 sein.
     */
    public void zeichneBaum(int aeste, double laenge)
    {
        this.zeichneBaum(aeste, 200, 200,laenge);
    }
    
    /**
     * Zeichnet einen Baum an einer bestimmten Position mit gewünschter länge und anzahl der Aeste.                                       
     * @param aeste die Anzahl der Aeste die der Baum haben soll, muss größer 0 sein
     * @param posX  die X Kordinate der Schildkröte
     * @param posY  die Y Kordinate der Schildkröte
     * @param laenge die laenge des Stammes und der Äeste muss größer 0 sein.
     */
    public void zeichneBaum(int aeste ,double posX, double posY, double laenge)
    {   
        Turtle turtle = new Turtle(posX,posY);
        turtle.drehe(-30);
        turtle.setzeFarbe((int)laenge % 13);
        if (laenge < 4)      // abbruchbedingung
        {   
            return;
        } 
        else 
        {    
             zeichneAst(aeste, posX, posY, laenge, 0, turtle);
        }
    }
    
    public void zeichneAst(int aeste ,double posX, double posY, double laenge,int ast, Turtle turtle)
    {
        if(ast<aeste)
        {
        turtle.geheVor(laenge);
        turtle.drehe(-120.0/(aeste-1));
        zeichneBaum(aeste, turtle.gibX(), turtle.gibY(), laenge/2);
        turtle.geheZu(posX,posY);
        zeichneAst(aeste, turtle.gibX(), turtle.gibY(), laenge, ast +1, turtle);
        }
    }
}