You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动画绘制向量场时如何排除动态圆形区域?

解决向量场绘制排除圆形内部并制作动画的问题

我想要绘制向量场与移动圆形,但不希望在圆形内部绘制向量场,同时要为整个效果制作动画。以下是我用于在整个网格上绘制向量场的代码:变量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)

解决方案

核心思路是计算每个网格点到圆形中心的距离,将圆形内部的向量分量置为0(quiver默认不显示U、V均为0的向量),具体修改如下:

  1. 初始化时处理初始圆形区域:在绘制初始quiver前,先计算初始圆心对应的内部区域,把该区域的U、V置为0。
  2. 动画帧中实时处理:每一帧更新圆形位置后,重新计算当前圆心对应的内部区域,更新U、V后再设置给quiver。

修改后的完整代码:

import matplotlib.animation as anim
import numpy as np
import matplotlib.pyplot as plt

# 假设positions和vectorFields已提前定义
X,Y = np.mgrid[-10:10,-10:10]
fig, ax = plt.subplots()
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)

# 初始化圆形
radius = 1
x0, y0 = positions[0,0,0], positions[0,1,0]
circle1 = plt.Circle((x0, y0), radius)
ax.add_patch(circle1)

# 处理初始向量场,排除圆形内部
U = vectorFields[:,:,0,0].copy()
V = vectorFields[:,:,1,0].copy()
distance_sq = (X - x0)**2 + (Y - y0)**2
mask = distance_sq <= radius**2
U[mask] = 0
V[mask] = 0
q = ax.quiver(X, Y, U, V)

def animate(i):
    # 更新圆形位置
    x0, y0 = positions[0,:,i]
    circle1.set_center((x0, y0))
    
    # 获取当前帧的向量场并处理
    U = vectorFields[:,:,0,i].copy()
    V = vectorFields[:,:,1,i].copy()
    # 计算距离平方(避免开根号,提升效率)
    distance_sq = (X - x0)**2 + (Y - y0)**2
    # 生成圆形内部的掩码
    mask = distance_sq <= radius**2
    # 将内部区域的向量置为0
    U[mask] = 0
    V[mask] = 0
    
    # 更新quiver的向量
    q.set_UVC(U, V)
    
    return [circle1, q]

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

关键说明

  • 使用距离平方代替距离比较,避免开根号运算,提升动画运行效率。
  • 对U、V进行copy()操作,防止修改原始的vectorFields数据。
  • 动画返回值需要加上q,确保blit模式能正确更新向量场的画面。

内容的提问来源于stack exchange,提问作者eeqesri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:30