====n-Tables==== Aus unserer Kindheit kennen wir Fadenbilder. Etwas ähnliches wollen wir diese Woche programmieren. {{:kurse:efcomputergrafik:fadenbild.png?200|}} Dazu ordnen wir $k$ Punkte in einem Kreis mit Radius $R=100$ symmetrisch an. Die Punkte werden dabei durchnummeriert, beginnend bei 0. Bei einen n-Table wird der Punkt mit der Nummer $i$ mit dem Punkt $n\cdot i$ verbunden. 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 //line(xStart,yStart,xEnd,yEnd)//. from math import pi,cos,sin from gpanel import * makeGPanel(-120, 120, -120, 120) anz=30 radius=100 dphi=2*pi/anz punkte=[] for i in range(anz): punkte.append([radius*cos(i*dphi),radius*sin(i*dphi)]) for i in range(anz): move(punkte[i][0],punkte[i][1]) fillCircle(1) #delay(25) # two-table n=2 for i in range(anz): line(punkte[i][0],punkte[i][1],punkte[(n*i)%anz][0],punkte[(n*i)%anz][1]) #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. {{:kurse:efcomputergrafik:2-table.png?200|}} **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. from math import pi,cos,sin from gpanel import * makeGPanel(-120, 120, -120, 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,110,str(n)+"-Table mit "+str(anzP)+" Punkten") dphi=2*pi/anzP punkte=[] for i in range(anzP): punkte.append([radius*cos(i*dphi),radius*sin(i*dphi)]) for i in range(anzP): move(punkte[i][0],punkte[i][1]) fillCircle(1) line(punkte[i][0],punkte[i][1],punkte[(n*i)%anzP][0],punkte[(n*i)%anzP][1]) 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.