kurse:efcomputergrafik:kw37

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, 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).

Click to display ⇲

Click to hide ⇱

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)

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

  1. Um das Bild zu verfeinern setze k=200 Punkte
  2. Erweitere eine Programm so, dass k von 30 bis 200 schrittweise durchläuft. Warte nach jedem Bild 100 ms.
  3. Welches Bild ergibt sich?

Click to display ⇲

Click to hide ⇱

Es entsteht die Kardioide, welche wir von der Mandelbrotmenge und vom abrollenden Kreis auf einem Kreis her kennen.

Aufgabe 3

  1. Ä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.
  2. Ändere dein Programm so ab, dass du über ein Eingabefenster dein $n$ eingeben kannst. Mit einer Eingabe von n<2 beendest du dein Programm.
  3. Ä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.

Click to display ⇲

Click to hide ⇱

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()

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.txt
  • Last modified: 2019/09/11 20:05
  • by Marcel Metzler