Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| kurse:efcomputergrafik:kw37 [2019/09/07 13:39] – Marcel Metzler | kurse:efcomputergrafik:kw37 [2019/09/11 18:05] (current) – Marcel Metzler | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====n-Tables==== | ||
| + | Aus unserer Kindheit kennen wir Fadenbilder. Etwas ähnliches wollen wir diese Woche programmieren. | ||
| + | {{: | ||
| + | |||
| + | Dazu ordnen wir $k$ Punkte in einem Kreis mit Radius $R=100$ symmetrisch an. Die Punkte werden dabei durchnummeriert, | ||
| + | |||
| + | Für ein $n=2$ ergeben sich folgende Verbindungen: | ||
| + | * 0 zu 0 (keine Linie) | ||
| + | * 1 zu 2 | ||
| + | * 2 zu 4 | ||
| + | * 3 zu 6 | ||
| + | * 4 zu 8 | ||
| + | * ... | ||
| + | * k-2 zu (2k-4) mod k | ||
| + | * k-1 zu (2k-2) mod k | ||
| + | |||
| + | **Aufgabe 1** | ||
| + | * Erstelle ein 2-Table mit k=30 Punkten | ||
| + | |||
| + | Dazu einige Tipps: | ||
| + | |||
| + | Die Punkte liegen alle auf einem Kreis mit Radius 100 um den Koordinatenursprung. Die Koordinaten sind dann $$x(\varphi)=R\cdot \cos(\varphi) \qquad \text{und} \qquad y(\varphi)=R \cdot \sin(\varphi) $$ Der Winkel $\varphi$ hängt von der Punktnummer ab. Für die Winkeländerung von Punkt zu Punkt gilt: $$\Delta \varphi = \dfrac{2\pi}{k}$$ Damit gilt $$x(i)=R\cdot \cos(\Delta\varphi\cdot i) \qquad \text{und} \qquad y(i)=R \cdot \sin(\Delta\varphi\cdot i) $$Sinnvollerweise werden die Punkte einmal berechnet und in einer Liste Punkte abgelegt. Nachher muss nur die Liste durchlaufen werden und der Punkt //n// wird mit dem Punkt //2n mod k// verbunden. Dazu verwenden wir den Befehl // | ||
| + | |||
| + | < | ||
| + | <code python 2-table> | ||
| + | from math import pi,cos,sin | ||
| + | from gpanel import * | ||
| + | makeGPanel(-120, | ||
| + | |||
| + | anz=30 | ||
| + | radius=100 | ||
| + | dphi=2*pi/ | ||
| + | punkte=[] | ||
| + | for i in range(anz): | ||
| + | punkte.append([radius*cos(i*dphi), | ||
| + | |||
| + | |||
| + | for i in range(anz): | ||
| + | move(punkte[i][0], | ||
| + | fillCircle(1) | ||
| + | #delay(25) | ||
| + | # two-table | ||
| + | n=2 | ||
| + | for i in range(anz): | ||
| + | line(punkte[i][0], | ||
| + | #delay(100) | ||
| + | </ | ||
| + | Mit den beiden //delay// Befehlen könnt ihr dem Aufbau des Bildes folgen. Wer nur am Endbild interessiert ist, der kann nicht nur die beiden //delay// Befehle entfernen, sondern kann auch die zweite und dritte //for// Schleifen zusammenfassen. | ||
| + | </ | ||
| + | |||
| + | **Aufgabe 2** | ||
| + | - Um das Bild zu verfeinern setze k=200 Punkte | ||
| + | - Erweitere eine Programm so, dass k von 30 bis 200 schrittweise durchläuft. Warte nach jedem Bild 100 ms. | ||
| + | - Welches Bild ergibt sich? | ||
| + | < | ||
| + | Es entsteht die Kardioide, welche wir von der Mandelbrotmenge und vom abrollenden Kreis auf einem Kreis her kennen. | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | **Aufgabe 3** | ||
| + | - Ändere dein Programm so ab, dass n-Tables von n=2 bis n=100 für ein k=200 erstellt werden. Warte nach jedem Bilde 200ms. | ||
| + | - Ändere dein Programm so ab, dass du über ein Eingabefenster dein $n$ eingeben kannst. Mit einer Eingabe von n<2 beendest du dein Programm. | ||
| + | - Ändere dein Programm so ab, dass du mit den Pfeiltasten Up und Down das $n$ vergrössern und verkleinern kannst. Schreibe jeweils die Nummer eines $n$-Table über das Bild. | ||
| + | < | ||
| + | <code python n-k-table> | ||
| + | from math import pi,cos,sin | ||
| + | from gpanel import * | ||
| + | makeGPanel(-120, | ||
| + | |||
| + | radius=100 | ||
| + | anzP=200 | ||
| + | UP = 38 | ||
| + | DOWN = 40 | ||
| + | LEFT = 37 | ||
| + | RIGHT = 39 | ||
| + | |||
| + | n=2 | ||
| + | key=0 | ||
| + | # Ende mit Esc | ||
| + | while key!=27: | ||
| + | if key==38: | ||
| + | n=n+1 | ||
| + | if key==40: | ||
| + | n=n-1 | ||
| + | if key==39: | ||
| + | anzP=anzP+1 | ||
| + | if key==37: | ||
| + | anzP=anzP-1 | ||
| + | clear() | ||
| + | text(-10, | ||
| + | dphi=2*pi/ | ||
| + | punkte=[] | ||
| + | for i in range(anzP): | ||
| + | punkte.append([radius*cos(i*dphi), | ||
| + | for i in range(anzP): | ||
| + | move(punkte[i][0], | ||
| + | fillCircle(1) | ||
| + | line(punkte[i][0], | ||
| + | key=getKeyCodeWait() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Aufgabe 4** | ||
| + | |||
| + | Je ein Profi und ein Bachelor / eine Bachelorette setzen sich zusammen und analysieren die Aufgabe 3.3. Als Guideline kann das obige Programm dienen. Der Profi ist Coach und hilft bei Unklarheiten. | ||
| + | |||
| + | **Ziel der Aufgabe** | ||
| + | |||
| + | Alle Teilnehmer vom EF CG verstehen, wie ein parametrisiertes n-Table realisiert wird und wie die Parameterübergabe bei einer Tastatureingabe funktioniert. | ||