Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1617:the_art_of_music:protokolle:05 [2017/02/02 16:22] cm.mint.2016 angelegt |
ws1617:the_art_of_music:protokolle:05 [2017/02/23 12:32] (aktuell) cm.mint.2016 |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== 2017-01-26: ====== | ====== 2017-01-26: ====== | ||
+ | |||
+ | Wir haben uns das erstes Mal mit der Visualisierung unseres Projekts auseinandergesetzt. | ||
+ | |||
+ | <code python> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | # | ||
+ | # server.py | ||
+ | # | ||
+ | # Copyright 2015 Stefan Born <born@math.tu-berlin.de> | ||
+ | # | ||
+ | # This program is free software; you can redistribute it and/or modify | ||
+ | # it under the terms of the GNU General Public License as published by | ||
+ | # the Free Software Foundation; either version 2 of the License, or | ||
+ | # (at your option) any later version. | ||
+ | # | ||
+ | # This program is distributed in the hope that it will be useful, | ||
+ | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
+ | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
+ | # GNU General Public License for more details. | ||
+ | # | ||
+ | # You should have received a copy of the GNU General Public License | ||
+ | # along with this program; if not, write to the Free Software | ||
+ | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
+ | # MA 02110-1301, USA. | ||
+ | # | ||
+ | # | ||
+ | |||
+ | import matplotlib | ||
+ | #matplotlib.use('GTKAgg') | ||
+ | import matplotlib.pyplot as plt | ||
+ | |||
+ | |||
+ | import numpy as np | ||
+ | import time | ||
+ | import sys | ||
+ | |||
+ | |||
+ | def anzeige(): | ||
+ | '''wird aufgerufen, um den Plot zu aktualisieren''' | ||
+ | fig.canvas.draw() | ||
+ | fig.canvas.flush_events() | ||
+ | |||
+ | |||
+ | |||
+ | def main(): | ||
+ | global im | ||
+ | while True: | ||
+ | |||
+ | ## verändere Bilddaten und setze diese | ||
+ | |||
+ | im=4*im*(1-im)#np.random.rand(N*N).reshape(N,N) | ||
+ | im=np.where(im<1,im, 1) | ||
+ | image.set_data(im) | ||
+ | |||
+ | ## verändere die Kreisdaten | ||
+ | |||
+ | # Mittelpunkt ist ein Attribut | ||
+ | |||
+ | c1.center=(c1.center[0]+np.random.randint(3)-1,c1.center[1]+np.random.randint(3)-1) | ||
+ | |||
+ | # Parameter wie 'color' verändert man so | ||
+ | |||
+ | matplotlib.artist.setp(c1,color=(np.random.rand(),np.random.rand(),np.random.rand())) | ||
+ | |||
+ | ## verändere die Dreiecksdaten: | ||
+ | |||
+ | dt=time.time()-now | ||
+ | p1.set_xy(np.array([[np.cos(dt)*N/2.+N/2., np.sin(dt)*N/2.+N/2], | ||
+ | [np.cos(0.4*dt)*N/2.+N/2., np.sin(0.4*dt)*N/2.+N/2], | ||
+ | [np.cos(0.1*dt)*N/2.+N/2., np.sin(0.1*dt)*N/2.+N/2]])) | ||
+ | matplotlib.artist.setp(p1,color=(np.abs(np.sin(dt)),np.abs(np.cos(dt)), np.abs(np.sin(1.777*dt)))) | ||
+ | |||
+ | |||
+ | ## Verändere die Farben der Dreiecke und Kanten (simultan) | ||
+ | |||
+ | # Hier wird eine Liste von Farbtripeln erzeugt | ||
+ | |||
+ | colors=[] | ||
+ | for i in range(len(triangles)): | ||
+ | colors.append((np.abs(np.sin(0.1*dt*i)),np.abs(np.sin(0.1*2*dt*i)),np.abs(0.1*np.sin(3*dt*i)))) | ||
+ | |||
+ | # Hier wird die Liste als den Dreiecken zugeordnet | ||
+ | |||
+ | triangle_collection.set_color(colors) | ||
+ | |||
+ | # Genauso für die Kanten, erst Liste erzeugen, dann zuordnen | ||
+ | |||
+ | colors=[] | ||
+ | for i in range(len(lines)): | ||
+ | colors.append((np.abs(np.sin(0.1*dt*i)),np.abs(np.sin(0.1*2*dt*i)),np.abs(0.1*np.sin(3*dt*i)))) | ||
+ | line_collection.set_color(colors) | ||
+ | |||
+ | ## Zeichne mit den aktuellen Werten | ||
+ | |||
+ | anzeige() | ||
+ | return 0 | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | |||
+ | now=time.time() | ||
+ | |||
+ | ############## | ||
+ | |||
+ | matplotlib.rcParams['toolbar'] = 'None' # Keine Buttons zum Vergrößern/Verkleinern anzeigen | ||
+ | fig=plt.figure() # Figure Objekt | ||
+ | |||
+ | N=100 | ||
+ | ax = plt.axes(xlim=(0,2*N),ylim=(0,2*N)) # Axes (Koordinatensystem)-Objekt | ||
+ | plt.axis("off") # Achsen nicht beschriften | ||
+ | |||
+ | ############## | ||
+ | |||
+ | # Ein Bild ("Artist") in ax erzeugen, das ein Array durch farbige Punkte ausdrückt | ||
+ | |||
+ | im=np.array([[np.abs(np.sin(0.1*(i*i+j*j))) for i in range(N)]for j in range(N)])#np.random.rand(N*N).reshape(N,N) | ||
+ | image=ax.imshow(im) | ||
+ | |||
+ | # Einen Kreis ("Artist") erzeugen und zu ax hinzufügen. | ||
+ | |||
+ | c1=matplotlib.patches.Circle([N/2,N/2],color=(1,0,0),alpha=0.8) | ||
+ | ax.add_artist(c1) | ||
+ | |||
+ | # Ein Dreieck mit identischen Ecken erzeugen und zu ax hinzufügen | ||
+ | |||
+ | p1=matplotlib.patches.Polygon(np.array([[1,0],[1,0],[1,0]]),color=(1.,0,0),alpha=0.8) | ||
+ | ax.add_artist(p1) | ||
+ | |||
+ | |||
+ | ## Eine Liste von Dreiecken erzeugen | ||
+ | |||
+ | ax1=fig.add_axes((0.5,0.5,0.5,0.5)) ## Standard-Koordinatensystem der neuen Achse 0-1 x 0-1 | ||
+ | ## lässt sich mit xlim und ylim überschreiben, s. o. | ||
+ | plt.axis("off") | ||
+ | |||
+ | triangles=[] | ||
+ | points=np.random.rand(30,2) | ||
+ | import scipy.spatial | ||
+ | tri=scipy.spatial.Delaunay(points) | ||
+ | for simplex in tri.simplices: | ||
+ | p=matplotlib.patches.Polygon(np.array([points[simplex[0]],points[simplex[1]],points[simplex[2]]])) | ||
+ | triangles.append(p) | ||
+ | triangle_collection=matplotlib.collections.PatchCollection(triangles) | ||
+ | ax1.add_artist(triangle_collection) | ||
+ | |||
+ | ## Eine Liste der zugehörigen Dreieckskanten | ||
+ | |||
+ | lines=set([]) | ||
+ | for simplex in tri.simplices: | ||
+ | lines.add((simplex[0],simplex[1])) | ||
+ | lines.add((simplex[1],simplex[2])) | ||
+ | lines.add((simplex[2],simplex[0])) | ||
+ | |||
+ | line_collection=matplotlib.collections.LineCollection([(points[line[0]], points[line[1]]) for line in lines],color=(0,1,0)) | ||
+ | ax1.add_artist(line_collection) | ||
+ | # Anzeigen | ||
+ | |||
+ | anzeige() | ||
+ | |||
+ | ## Beim erstem Aufbau der Graphik muss eine solche Pause erzwungen werden | ||
+ | ## für die späteren Updates der Graphik ist das nicht notwendig. | ||
+ | |||
+ | plt.pause(0.05) | ||
+ | |||
+ | # Animationsschleife starten | ||
+ | |||
+ | main() | ||
+ | </code> |