#python #matplotlib #spyder
#питон #matplotlib #спайдер
Вопрос:
Я хочу сделать анимированный сюжет о бале. Что — то вроде того, что здесь изображено. Проблема в том, что я хочу, чтобы он не отскакивал от оси, вместо этого я хочу, чтобы он продолжал двигаться по сюжету, но появлялся с другой стороны, как зеркало.
import numpy as np import matplotlib.pyplot as plt plt.figure(1) plt.clf() plt.axis([-10,10,-10,10]) n=10 pos=(20*np.random.sample(n*2)-10).reshape(n,2) vel=(0.3*np.random.normal(size=n*2)).reshape(n,2) sizes=100*np.random.sample(n) 100 colors=np.random.sample([n,4]) circles=plt.scatter(pos[:,0], pos[:,1], marker='o', s=sizes, c=colors) for i in range(100): pos=pos vel bounce=abs(pos)gt;10 vel[bounce] = -vel[bounce] circles.set_offsets(pos) plt.draw() plt.pause(0.05) plt.show()
Ответ №1:
Один из способов сделать это-просто заменить строку vel[bounce] = -vel[bounce]
на pos[bounce]=-pos[bounce]
. Это приведет к сбросу положения шаров, которые достигают рамки, на противоположный край рамки.
Полный код ниже:
import numpy as np import matplotlib.pyplot as plt fig=plt.figure(1) plt.axis([-10,10,-10,10]) n=10 pos=(20*np.random.sample(n*2)-10).reshape(n,2) vel=(0.3*np.random.normal(size=n*2)).reshape(n,2) sizes=100*np.random.sample(n) 100 colors=np.random.sample([n,4]) circles=plt.scatter(pos[:,0], pos[:,1], marker='o', s=sizes, c=colors) for i in range(100): pos=pos vel bounce=abs(pos)gt;10 pos[bounce]=-pos[bounce] circles.set_offsets(pos) plt.draw() plt.pause(0.05) plt.show()
И это результат:
Комментарии:
1. Спасибо, приятель, мне действительно было трудно это сделать.