matplotlib 在动画中排除动态区域以绘制矢量场

hs1ihplo  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(162)

我想画一个向量场和一个移动的圆,但我不想画圆内的向量场。此外,我想把整个事情做得生动一些。下面是我在整个网格上绘制向量场的代码。变量“positions”包含圆的坐标。变量“vectorFields”包含整个网格上的向量场的分量。我怎样才能把这个区域从它内部的向量场中排除呢?

import matplotlib.animation as anim
X,Y = np.mgrid[-10:10,-10:10]
fig, ax = plt.subplots()
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
circle1=plt.Circle((positions[0,0,0], positions[0,1,0]),1)
ax.add_patch(circle1)
U=vectorFields[:,:,0,0]
V=vectorFields[:,:,1,0]
q = ax.quiver(X, Y, U, V)

def animate(i):
   circle1.set_center(positions[0,:,i])

   U=vectorFields[:,:,0,i]
   V=vectorFields[:,:,1,i]
   q.set_UVC(U, V)

   return [circle1]

theAnimation = anim.FuncAnimation(fig, animate, frames=1000, interval=10, blit=True)
2admgd59

2admgd591#

所以我找到了问题的答案。诀窍在于,可以计算网格中每个点到圆的距离。如果距离小于半径,则可以将该点处的向量场设置为零。这相当于不绘制圆内的向量,因为消失的向量不会被绘制。

for i in range(timesteps):
      centre_x=positions[0,0,i]
      centre_y=positions[0,1,i]
      for k in range(GridMax):
         for l in range(GridMax):
            distance_from_centre=math.sqrt((k-GridMax/2-centre_x)**2+(l-GridMax/2-centre_y)**2)
            if distance_from_centre<=cell.bead_radius:
               vectorFields[k,l,0,i]=0
               vectorFields[k,l,1,i]=0

相关问题