Ich habe einen Punkt P gezeichnet, der mit Python funktioniert, und ihn als GIF ausgegeben.
Stellen wir uns das Problem des Bewegungspunkts P wie folgt vor.
Es gibt ein rechteckiges ABCD mit AB = 4 cm, BC = 6 cm, und Punkt P beginnt bei A und geht bei 1 cm pro Sekunde von A → B → C → D aus. Der Bereich von △ APD nach $ x $ Sekunden ab Abflug sei $ y $ cm 2 </ sup>.
Quelle https://math.005net.com/yoten/doten.php (2 cm pro Sekunde sind jedoch 1 cm pro Sekunde.)
Bereiten Sie sich zunächst auf das Zeichnen der Figur vor.
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
plt.show()
Machen Sie ein Rechteck 4 cm lang und 6 cm breit. Hier gibt es verschiedene Möglichkeiten, um auszuwählen, wo der Koordinatenursprung $ O $ platziert werden soll. Wählen Sie diesmal den Schwerpunkt des Rechtecks (2 cm lang und 3 cm breit) als Ursprung $ O $ und bestimmen Sie die Koordinaten der Punkte A, B, C und D. Dies erleichtert den Code, wenn die Beschriftung später eine Runde außerhalb des Rechtecks erscheinen soll.
Verwenden Sie matplotlib.patches
, um die Figur zu zeichnen. Außerdem möchte ich die Koordinaten der Punkte als Vektor behandeln, also gebe ich auch "numpy" ein.
Verwenden Sie set_xlim
, set_ylim
, um die Bereiche der x- und y-Achse etwas größer als das Rechteck zu machen, sodass das Rechteck in den Rahmen passt.
Definieren Sie die Koordinaten der Punkte A, B, C, D mit dem Typ "np.array".
Machen Sie ein Rechteck mit "pat.Polygon" und fügen Sie es zu "ax1" hinzu.
import numpy as np #hinzufügen
import matplotlib.pyplot as plt
import matplotlib.patches as pat #hinzufügen
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlim(-4,4)
ax1.set_ylim(-3,3)
A=np.array([-3,2])
B=np.array([-3,-2])
C=np.array([3,-2])
D=np.array([3,2])
p = pat.Polygon(xy = [A,B,C,D],
edgecolor='black',
facecolor='white',
linewidth=1.6)
ax1.add_patch(p)
plt.show()
Zeichnen Sie die Länge der Seite
text
kann Zeichen zeichnen, indem die x-Koordinate im ersten Argument, die y-Koordinate im zweiten Argument und der Name im dritten Argument angegeben werden.
#Zeigen Sie die Länge der Seite an
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
Passen Sie die Platzierung nach Ihren Wünschen an.
Als nächstes wird der Name des Punktes außerhalb des Rechtecks angezeigt. Sie können die Anzeigeposition von Hand sowie die Länge der Seite festlegen.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlim(-4,4)
ax1.set_ylim(-3,3)
A=np.array([-3,2])
B=np.array([-3,-2])
C=np.array([3,-2])
D=np.array([3,2])
pol = pat.Polygon(xy = [A,B,C,D],
edgecolor='black',
facecolor='white',
linewidth=1.6)
ax1.add_patch(pol)
#Zeigen Sie die Länge der Seite an
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
#Zeigen Sie den Namen des Scheitelpunkts an
scale=1.1
ax1.text(A[0]*scale,A[1]*scale,"A",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(B[0]*scale,B[1]*scale,"B",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(C[0]*scale,C[1]*scale,"C",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(D[0]*scale,D[1]*scale,"D",fontsize=15,horizontalalignment='center',verticalalignment='center')
plt.show()
Die Hauptrolle ist endlich da. Definieren Sie die Koordinaten von Punkt P und zeigen Sie die Punkte mit "ax1.plot ()" an. Die Anzeige des Namens von Punkt P entspricht der der Punkte A, B, C und D.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlim(-4,4)
ax1.set_ylim(-3,3)
A=np.array([-3,2])
B=np.array([-3,-2])
C=np.array([3,-2])
D=np.array([3,2])
pol = pat.Polygon(xy = [A,B,C,D],
edgecolor='black',
facecolor='white',
linewidth=1.6)
ax1.add_patch(pol)
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
scale=1.1
ax1.text(A[0]*scale,A[1]*scale,"A",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(B[0]*scale,B[1]*scale,"B",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(C[0]*scale,C[1]*scale,"C",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(D[0]*scale,D[1]*scale,"D",fontsize=15,horizontalalignment='center',verticalalignment='center')
P=np.array([-3.0,1.0])
#Zeigen Sie den Bewegungspunkt P an
scale_P=1.2
ax1.plot(P[0],P[1],marker='o',color='black')
ax1.text(P[0]*scale_P,P[1]*scale_P,"P",fontsize=15,horizontalalignment='center',verticalalignment='center')
plt.show()
Erstellen Sie eine dreieckige APD und fügen Sie sie auf die gleiche Weise wie beim Erstellen der rechteckigen ABCD zum Diagramm hinzu. Löschen Sie dann die x- und y-Achse.
%matplotlib nbagg
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlim(-4,4)
ax1.set_ylim(-3,3)
A=np.array([-3,2])
B=np.array([-3,-2])
C=np.array([3,-2])
D=np.array([3,2])
pol = pat.Polygon(xy = [A,B,C,D],
edgecolor='black',
facecolor='white',
linewidth=1.6)
ax1.add_patch(pol)
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
scale=1.1
ax1.text(A[0]*scale,A[1]*scale,"A",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(B[0]*scale,B[1]*scale,"B",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(C[0]*scale,C[1]*scale,"C",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(D[0]*scale,D[1]*scale,"D",fontsize=15,horizontalalignment='center',verticalalignment='center')
P=np.array([-3.0,1.0])
scale_P=1.2
ax1.plot(P[0],P[1],marker='o',color='black')
ax1.text(P[0]*scale_P,P[1]*scale_P,"P",fontsize=15,horizontalalignment='center',verticalalignment='center')
#△ APD hinzugefügt
S = pat.Polygon(xy = [A,P,D],
edgecolor='black',
facecolor='lightgray',
linewidth=1.6)
ax1.add_patch(S)
#Löschen Sie den Rahmen
plt.axis('off')
plt.show()
Verschieben Sie den Bewegungspunkt P und geben Sie ihn als Animation im GIF-Format aus. Eine Animation wird erstellt, indem die Koordinaten des Bewegungspunkts P jedes Mal nach $ x $ Sekunden aktualisiert und Frame für Frame gezeichnet werden.
moveP (x)
klassifiziert, wo sich der Bewegungspunkt P in den Linien AB, BC und CD von der verstrichenen Zeit befindet, und gibt die Koordinaten des Bewegungspunkts P zurück.anim.save ()
ausgeben.%matplotlib nbagg #Erforderlich, um die Animation auf dem Jupiter-Notebook anzuzeigen
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat
from matplotlib.animation import PillowWriter,FuncAnimation #Zur Videoerstellung hinzugefügt
fig = plt.figure()
ax1 = fig.add_subplot(111)
A=np.array([-3,2])
B=np.array([-3,-2])
C=np.array([3,-2])
D=np.array([3,2])
scale=1.1
scaleP=1.2
p = pat.Polygon(xy = [A,B,C,D],
edgecolor='black',
facecolor='white',
linewidth=1.6)
def initialize():
ax1.set_xlim(-4,4)
ax1.set_ylim(-3,3)
ax1.add_patch(p)
ax1.text(A[0]*scale,A[1]*scale,"A",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(B[0]*scale,B[1]*scale,"B",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(C[0]*scale,C[1]*scale,"C",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(D[0]*scale,D[1]*scale,"D",fontsize=15,horizontalalignment='center',verticalalignment='center')
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
def moveP(x):
if 0<= x <4:
return A+np.array([0,-1])*x*velocity
elif 4<=x <10:
return B+np.array([1,0])*(x-4)*velocity
elif 10<= x <14:
return C+np.array([0,1])*(x-10)*velocity
else:
return D
velocity=1.0
timestep=0.1
def animate(t):
plt.cla()
initialize()
x=timestep*t
P=moveP(x)
ax1.plot(P[0],P[1],marker='o',color='black')
ax1.text(P[0]*scaleP,P[1]*scaleP,"P",fontsize=15,horizontalalignment='center',verticalalignment='center')
S = pat.Polygon(xy = [A,P,D],
edgecolor='black',
facecolor='lightgray',
linewidth=1.6)
ax1.add_patch(S)
plt.axis('off')
plt.title('x=' + '{:.1f}'.format(x)+'sec')
anim = FuncAnimation(fig,animate,frames=140,repeat=True,interval=timestep*1000)
#anim.save("ugokutenP.gif", writer='pillow',fps=10)
plt.show()
Recommended Posts