{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 5: Module und Pakete\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 5.3 Beispiel für eine Turtle-Grafik\n",
    "\n",
    "Unsere Aufgabe ist es, ein Programm zu erstellen, das den \"Baum des Pytagoras\" ausgibt.\n",
    "\n",
    "![Baum des Pytagoras](../img/BaumPytagoras.png \"Baum des Pytagoras\")\n",
    "\n",
    "Dazu erzeugen wir uns zunächst ein Ausgabefeld der Größe 400x400 und zeigen es an."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "from ipyturtle import Turtle\n",
    "turtle = Turtle(width=400, height=400)\n",
    "turtle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Dann ist es ganz hilfreich, eine Funktion zu definieren, die an der aktuellen Stiftposition\n",
    "ein Quadrat vorgegebener Größe zeichnet."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def quadrat(seite):\n",
    "    for _ in range(4):\n",
    "        turtle.forward(seite)\n",
    "        turtle.right(90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Die Verästelung des Baums erfolgt ja immer in Form eines rechtwinkligen Dreiecks. Wir bereiten\n",
    "eine Funktion vor, mit deren Hilfe sich aus der Größe des Hauptastes die Größe der Teiläste\n",
    "berechnen lässt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "def teilast(hauptast):\n",
    "    return math.sqrt(hauptast * hauptast / 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Nun können wir eine rekursive Funktion definieren, die den Baum zeichnet."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def baum(seite):\n",
    "    if seite < 10:\n",
    "        return\n",
    "    # Stamm\n",
    "    quadrat(seite)\n",
    "    ast = teilast(seite)\n",
    "    # linker Ast\n",
    "    turtle.penup()\n",
    "    turtle.forward(seite)\n",
    "    turtle.left(45)\n",
    "    turtle.pendown()\n",
    "    baum(ast)\n",
    "    # rechter Ast\n",
    "    turtle.penup()\n",
    "    turtle.right(90)\n",
    "    turtle.forward(ast)\n",
    "    turtle.pendown()\n",
    "    baum(ast)\n",
    "    #zurück zum Ausgangspunkt beim Stamm\n",
    "    turtle.penup()\n",
    "    turtle.back(ast)\n",
    "    turtle.left(45)\n",
    "    turtle.back(seite)\n",
    "    turtle.pendown()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Jetzt können wir den Stift an den unteren Rand bewegen und den Baum zeichnen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "turtle.reset()\n",
    "turtle.penup()\n",
    "turtle.back(180)\n",
    "turtle.left(90)\n",
    "turtle.forward(50)\n",
    "turtle.right(90)\n",
    "turtle.pendown()\n",
    "baum(70)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Schön, oder?\n"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
