kurse:efcomputergrafik:kw37

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
kurse:efcomputergrafik:kw37 [2019/09/07 15:03]
Marcel Metzler
kurse:efcomputergrafik:kw37 [2019/09/11 20:05] (current)
Marcel Metzler
Line 1: Line 1:
 ====n-Tables==== ====n-Tables====
-Aus unserer Kindheit kennen wir Fadenbilder.+Aus unserer Kindheit kennen wir Fadenbilder. Etwas ähnliches wollen wir diese Woche programmieren.
  
 {{:kurse:efcomputergrafik:fadenbild.png?200|}} {{:kurse:efcomputergrafik:fadenbild.png?200|}}
  
-Dazu ordnen wir $k$ Punkte in einem Kreis mit Radius $R=100$ symmetrisch an. Die Punkte werden dabei durchnummeriert. Bei einen n-Table wird der Punkt mit der Nummer $i$ mit dem Punkt $n\cdot i$ verbunden.+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: Für ein $n=2$ ergeben sich folgende Verbindungen:
 +  * 0 zu 0 (keine Linie)
   * 1 zu 2   * 1 zu 2
   * 2 zu 4   * 2 zu 4
Line 14: Line 15:
   * k-2 zu (2k-4) mod k   * k-2 zu (2k-4) mod k
   * k-1 zu (2k-2) mod k   * k-1 zu (2k-2) mod k
-  * k zu 2k 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)//
 + 
 +<hidden> 
 +<code python 2-table> 
 +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) 
 +</code> 
 +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. 
 +</hidden> 
 + 
 +**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? 
 +<hidden> 
 +Es entsteht die Kardioide, welche wir von der Mandelbrotmenge und vom abrollenden Kreis auf einem Kreis her kennen. 
 +{{:kurse:efcomputergrafik:2-table.png?200|}} 
 +</hidden> 
 + 
 +**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.  
 +<hidden> 
 +<code python n-k-table> 
 +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() 
 +</code> 
 +</hidden> 
 + 
 +**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. 
  • kurse/efcomputergrafik/kw37.1567861428.txt.gz
  • Last modified: 2019/09/07 15:03
  • by Marcel Metzler