kurse:efcomputergrafik:kw36

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:kw36 [2019/09/04 14:08]
Marcel Metzler [Callbacks]
kurse:efcomputergrafik:kw36 [2019/09/04 15:14] (current)
Marcel Metzler [Callbacks]
Line 174: Line 174:
 Bearbeite dazu das [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=grafik/mausevents.inc.php|Kapitel 3.7 von Tigerjython.]] Bearbeite dazu das [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=grafik/mausevents.inc.php|Kapitel 3.7 von Tigerjython.]]
  
-Ein Callback ist somit eine Verzweigung des Programmes aufgrund eines äusseren Ereignisses. Diese äusseren Ereignisse sind von uns Usern initiiert, indem wir mit der Mause oder mit der Tastatur eine Eingabe vornehmen.+Ein Callback ist somit eine Verzweigung des Programmes aufgrund eines äusseren Ereignisses. Diese äusseren Ereignisse sind von uns Usern initiiert, indem wir mit der Mause oder mit der Tastatur eine Eingabe vornehmen. Aufgrund eines Ereignisses $E$ springt das Programm in ein dafür vorgesehenes Unterprogramm $UP$ führt dieses aus und kehrt wieder an die alte Stelle im Programm zurück um dort weiterzufahren.
  
 +Alle Ereignisse $E$, auf die wir reagieren wollen, müssen wir bei der Initialisierung des GPanel's angeben.
    
 +<code python>
 +makeGPanel(mousePressed = onMousePressed, 
 +           mouseReleased = onMouseReleased)
 +</code>
 +//mousePressed// und //mouseReleased// sind dabei die Ereignisse, //onMousePressed// und //onMouseReleased// sind die Namen der Unterprogramme die beim Eintreten des Ereignisses ausgeführt werden sollen. Eine Liste der Ereignisse findet ihr in der [[http://www.tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=grafik/gpaneldoc.html|Dokumentation]] von Tigerjython.
 +
 +**Aufgabe 4**
 +  - Studiere das nachfolgende Programm
 +  - Was macht das Programm? Bist du dir nicht sicher, so lade es herunter und probiere es aus.
 +
 +<code python Callback>
 +from gpanel import *
 +
 +def onMousePressed(x,y):
 +    clear()
 +    move(x,y)
 +    text("Eine Mausetaste wurde gedrückt")
 +
 +def onMouseReleased(x,y):
 +    clear()
 +    move(x,y)
 +    text("Die Mausetaste wurde wieder losgelassen")
 +
 +def onMouseDragged(x,y):
 +    clear()
 +    move(x,y)
 +    text("Die Mause bewegt sich (ev.) mit gedrückter Taste")
 +       
 +makeGPanel(mousePressed = onMousePressed, 
 +           mouseReleased = onMouseReleased,
 +           mouseDragged = onMouseDragged)
 +</code>
 +
 +**Aufgabe 5**
 +  - Ergänze dein Mandelbrot Programm so, dass du mit der Mause einen Zoombereich festlegen kannst. In einer ersten Version musst du den Zoombereich nicht mit einem Rechteck oder Quadrat anzeigen.
 +  - Ergänze deine erste Version Mandelbrot mit Zoom so, dass der Zoobereich mit einem farbigen Rechteck oder Quadrat angezeigt wird. Benutze dabei die Idee aus Tigerjython bei den Gummibandlinien.
 +
 +Hier eine mögliche Lösung.
 +<code python Mandelbrot-Zoom>
 +from gpanel import *
 +
 +def onMousePressed(x, y):
 +    global xmin, ymin
 +    storeGraphics()
 +    xmin=x
 +    ymin=y
 +
 +def onMouseReleased(x, y):
 +    global xmax,ymax
 +    global neuesBild
 +    xmax=x
 +    ymax=ymin+(xmax-xmin)
 +    neuesBild=0
 +
 +def onMouseDragged(x, y):
 +    global xmin,ymin
 +    delta=x-xmin
 +    recallGraphics()
 +    move(xmin,ymin)
 +    setColor("white")
 +    line(xmin, ymin, xmin+delta, ymin)
 +    line(xmin+delta, ymin, xmin+delta, ymin+delta)
 +    line(xmin+delta, ymin+delta, xmin, ymin+delta)
 +    line(xmin, ymin+delta, xmin, ymin)
 +    
 +def getIterationColor(it):
 +    color = makeColor((it**2) % 256, 
 +                      (3*it) % 256, 
 +                      (5*it) % 256)
 +    return color
 +    
 +def Mandelbrot(c):
 +    z=0
 +    it=0
 +    while it<maxIterations and abs(z)<R :
 +        z = z**2 + c     
 +        it=it+1          
 +        if abs(z) > R:  
 +            return it
 +    return maxIterations
 +
 +def drawP():
 +    global xmin, xmax, xstep, xSize
 +    global ymin, ymax, ystep, ySize
 +    xstep=(xmax-xmin)/xSize
 +    ystep=(ymax-ymin)/ySize
 +    makeGPanel(Size(xSize,ySize),
 +        mousePressed = onMousePressed, 
 +        mouseReleased = onMouseReleased,
 +        mouseDragged = onMouseDragged)
 +    window(xmin, xmax, ymin, ymax)
 +    y = ymin
 +    while y <= ymax:
 +        x = xmin
 +        while x <= xmax:
 +            c = complex(x,y)
 +            itCount = Mandelbrot(c)
 +            if itCount == maxIterations:
 +                setColor("black")
 +            else:
 +               setColor(getIterationColor(itCount))
 +            point(c)
 +            x += xstep
 +        repaint()
 +        y += ystep    
 +#---------------------------------------
 +# Hauptprogramm
 +#---------------------------------------
 +R = 2
 +maxIterations = 100
 +xmin = -2
 +xmax = 1
 +ymin = -1.5
 +ymax = 1.5
 +xSize=600
 +ySize=600
 +neuesBild=0
 +key = 0
 +while key!=27:
 +    if neuesBild==0:
 +        drawP();
 +        neuesBild=1
 +    key = getKeyCode()
 +</code>
  • kurse/efcomputergrafik/kw36.1567598895.txt.gz
  • Last modified: 2019/09/04 14:08
  • by Marcel Metzler