J'ai dessiné un point P qui fonctionne avec Python et l'ai affiché sous forme de gif.
Visualisons le problème du déplacement du point P comme suit.
Il existe un ABCD rectangulaire avec AB = 4cm, BC = 6cm, et le point P part de A et procède de A → B → C → D à 1cm par seconde. Soit l'aire de △ APD après $ x $ secondes du départ soit $ y $ cm 2 </ sup>.
La source https://math.005net.com/yoten/doten.php (Cependant, 2 cm par seconde équivaut à 1 cm par seconde.)
Tout d'abord, préparez-vous à dessiner la figure.
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
plt.show()
Faites un rectangle de 4 cm de long et 6 cm de large. Ici, il existe différentes manières de choisir où placer l'origine des coordonnées $ O $. Cette fois, sélectionnez le centre de gravité du rectangle (2 cm de longueur et 3 cm de largeur) comme origine $ O $, et déterminez les coordonnées des points A, B, C et D. Cela facilitera le code si vous souhaitez plus tard que l'étiquette apparaisse un tour à l'extérieur du rectangle.
Utilisez matplotlib.patches
pour dessiner la figure. Aussi, je veux traiter les coordonnées des points comme un vecteur, donc j'entre également «numpy».
Utilisez set_xlim
, set_ylim
pour rendre les plages de l'axe x et de l'axe y légèrement plus grandes que le rectangle afin que le rectangle tienne dans le cadre.
Définissez les coordonnées des points A, B, C, D avec le type np.array
.
Créez un rectangle avec pat.Polygon
et ajoutez-le à ʻax1`.
import numpy as np #ajouter à
import matplotlib.pyplot as plt
import matplotlib.patches as pat #ajouter à
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()
Dessinez la longueur du côté
text
peut dessiner des caractères en spécifiant la coordonnée x dans le premier argument, la coordonnée y dans le deuxième argument et le nom dans le troisième argument.
#Afficher la longueur du côté
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
Ajustez le placement à votre guise.
Ensuite, le nom du point est affiché à l'extérieur du rectangle. Vous pouvez décider à la main de la position d'affichage ainsi que de la longueur du côté.
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)
#Afficher la longueur du côté
ax1.text(-3.5,0.0,"4cm",horizontalalignment='center',verticalalignment='center')
ax1.text(0.0,-2.5,"6cm",horizontalalignment='center',verticalalignment='center')
#Afficher le nom du sommet
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()
Le rôle principal est enfin là. Définissez les coordonnées du point P et affichez les points avec ʻax1.plot () `. La façon d'afficher le nom du point P est la même que celle des points A, B, C et 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])
#Afficher le point mobile P
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()
Créez un APD triangulaire et ajoutez-le au diagramme de la même manière que lorsque vous avez créé l'ABCD rectangulaire, puis effacez les axes x et y.
%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')
#△ Ajout d'APD
S = pat.Polygon(xy = [A,P,D],
edgecolor='black',
facecolor='lightgray',
linewidth=1.6)
ax1.add_patch(S)
#Effacer le cadre
plt.axis('off')
plt.show()
Déplacez le point mobile P et exportez-le sous forme d'animation au format gif. Une animation est créée en mettant à jour les coordonnées du point mobile P après $ x $ secondes à chaque fois et en dessinant image par image.
moveP (x)
classe où se trouve le point mobile P dans les lignes AB, BC et CD à partir du temps écoulé, et renvoie les coordonnées du point mobile P.PillowWriter
et FuncAnimation
pour créer des animations.
ʻAnimate (i) résume toutes les opérations à effectuer dans une mise à jour de dessin, et crée une animation en prenant l'argument de
FuncAnimation`.%matplotlib nbagg #Requis pour afficher l'animation sur le notebook Jupyter
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat
from matplotlib.animation import PillowWriter,FuncAnimation #Ajouté pour la création vidéo
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