Wenn es irgend geht versuche ich, die Berechnungen graphisch zu
visualisieren. Dazu benutze ich die sog. turtle-Grafik, weil sie im Python
mitgeliefert wird und nichts zusätzlich installiert werden muss. Allerdings
eignet sich dieser Grafikrahmen nicht besonders gut für pyhsikalische
Präsentationen. Aus diesem Grund habe ich eine kleie Bibliothek geschireben,
welche ich in die Programm einbinde. Sie gestatte es, Daten in zwei- und
dreidimensionale Kartesischen Koordinatensystemen darzustellen.
Wenn ihr
das selbst nutzt, bitte beachten: Die Grafik wird langsamer, wenn mehr Punkte
eingetragen werden. Bei aufwendigen Rechnungen mit Zeitverläufen lösche ich
die Grafik aller paar Runden.
# Plot und Koordinatensystem, auch 3D
from math import *
from turtle import *
# im 2D-Kooridinatensystem oder ohne Koordinaten
# ########################
def plot(x,y, thickness, col1, col2, col3): # einen Punkt setzen mit berechneter Farbe
color(col1, col2, col3)
penup()
goto(x,y)
pendown()
dot(thickness)
hideturtle()
def Plot(x,y, thickness, col): # einen Punkt setzen mit benannter Farbe
color(col)
penup()
goto(x,y)
pendown()
dot(thickness)
hideturtle()
def PLOT(x,y,thickness, col): # Punkt mit berechnetem Grauwert setzen
plot(x,y,thickness,col,col,col)
def Line(x0,y0,x1,y1, thickness, col): # Linie ziehen, benannte Farbe
color(col)
width(thickness)
if (x1<x0): #dx stets>0 wg.atan
h=x0;x0=x1;x1=h
h=y0;y0=y1;y1=h
penup(); goto(x0,y0)
dx=x1-x0; dy=y1-y0
pendown()
if (dx<1e-10):
setheading(90)
forward(dy)
else:
setheading(180*atan(dy/dx)/pi)
forward(sqrt(dx*dx+dy*dy))
hideturtle()
def line(x0,y0,x1,y1): # dünne schwarze Linie
Line(x0,y0,x1,y1, 1, 'black')
def greenline(x0,y0,x1,y1): # dünne grüne Linie
Line(x0,y0,x1,y1, 1, 'lightgreen')
# Koordinatensystem 2D
def initKoor(x0,x1,stepX, y0,y1,stepY):
reset()
tracer(0,0)
setworldcoordinates(x0-0.01*(x1-x0),y0-0.01*(y1-y0),x1+0.01*(x1-x0),y1+0.01*(y1-y0))
line(x0,y0,x0,y1)
line(x0,y0,x1,y0)
x=x0;y=y0
while (y<=y1):
if y>y0+1e-10:
greenline(x,y,x1,y)
line(x,y,x+0.01*(x1-x0),y)
write(str(round(y, 4)), font=('Arial',10))
y=y+stepY
x=x0;y=y0
while (x<=x1):
if x>x0+1e-10:
greenline(x,y,x,y1)
line(x,y,x,y+0.01*(y1-y0))
write(str(round(x, 4)), font=('Arial',10))
x=x+stepX
update()
X0=0;Y0=0;Z0=0;XE=0;YE=0;ZE=0
s30=0.5;c30=0.866025 # cos(30°)
# im 3D-Koordinatensystem
# ########################
# im 3d_koordinatensystem sind berechnete Farben wenig nützlich
# deshalb gibt es nur Funktionen mit benannten Farben
def Line3D(x0,y0,z0, x1,y1,z1,thickness,col): # Linie mit benannter Farbe
dy0=(y0-Y0)/(YE-Y0) # /2 = Anpassung an die Achse
dy1=(y1-Y0)/(YE-Y0) # /2 = Anpassung an die Achse
Line(x0+c30*dy0*(XE-X0), z0+s30*dy0*(ZE-Z0), x1+c30*dy1*(XE-X0), z1+s30*dy1*(ZE-Z0),thickness,col)
def line3D(x0,y0,z0,x1,y1,z1): # dünne schwarze Linie
Line3D(x0,y0,z0,x1,y1,z1, 1, "black")
def greenline3D(x0,y0,x1,y1): # dünne grüne Linie
Line3D(x0,y0,Z0, x1,y1,Z0, 1, 'lightgreen')
def PLOT3D(x,y,z,thickness, col): # Punkt mit benannter Farbe, mit Linie auf die (0,0)-Ebene
dy=(y-Y0)/(YE-Y0) # /2 = Anpassung an die Achse
Line(x+c30*dy*(XE-X0), 0+s30*dy*(ZE-Z0), x+c30*dy*(XE-X0), z+s30*dy*(ZE-Z0),1,col)
Plot(x+c30*dy*(XE-X0), z+s30*dy*(ZE-Z0), thickness, col)
def Plot3D(x,y,z,thickness, col): # Punkt mit benannter Farbe, mit Linie auf die xy-Grundebene
dy=(y-Y0)/(YE-Y0) # /2 = Anpassung an die Achse
Line(x+c30*dy*(XE-X0), Z0+s30*dy*(ZE-Z0), x+c30*dy*(XE-X0), z+s30*dy*(ZE-Z0),1,col)
Plot(x+c30*dy*(XE-X0), z+s30*dy*(ZE-Z0), thickness, col)
def plot3D(x,y,z): # fetter schwarzer Punkt mit Linie auf die xy-Grundebene
Plot3D(x,y,z,5,"black")
# das 3D-Koordinatensystem selbst
def initKoor3D(x0,x1,stepX, y0,y1,stepY, z0,z1,stepZ):
reset()
global X0, Y0, Z0, XE, YE, ZE
X0=x0; Y0=y0; Z0=z0; XE=x1; YE=y1; ZE=z1
tracer(0,0)
setworldcoordinates(x0-0.01*(x1-x0),z0-0.01*(z1-z0),x1+0.01*(x1-x0),z1+0.01*(z1-z0))
print(x0-0.01*(x1-x0),z0-0.01*(z1-z0),x1+0.01*(x1-x0),z1+0.01*(z1-z0))
#x-Koordinate
line3D(x0,y0,z0,x1,y0,z0)
x=x0
while (x<=x1):
if x>x0+1e-10:
greenline3D(x,y0,x,y1)
line3D(x,y0,z0,x,y0+0.01*(y1-y0),z0)
write(str(round(x, 4)), font=('Arial',10))
x=x+stepX
#y-Koordinate, 30 Grad
line3D(x0, y0, z0, x0, y1 ,z0)
y=y0
while (y<=y1):
if y>y0+1e-10:
greenline3D(x0,y,x1,y)
line3D(x0,y,z0, x0+0.01*(x1-x0), y,z0)
write(str(round(y, 4)), font=('Arial',10))
y=y+stepY
#z-Koordinate
line3D(x0,y0,z0,x0,y0,z1)
x=x0;y=y0;z=z0
while (z<=z1):
line3D(x0,y0,z, x0+0.01*(x1-x0), y0,z)
write(str(round(z, 4)), font=('Arial',10))
z=z+stepZ
update()
Uwe Pilz, Januar 2020