gpt4 book ai didi

python - 如何沿路径移动补丁?

转载 作者:行者123 更新时间:2023-12-05 04:19:15 25 4
gpt4 key购买 nike

我正在尝试使用 matplotlib 为 patch.Rectangle 对象制作动画。我希望所述对象沿着 path.Arc 移动。一种迂回的方法是(大约):

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
import matplotlib.patches as mpat

fig, ax = plt.subplots()
ax.set(xlim=(0, 10), ylim=(0, 10))


# generate the patch
patch = mpat.Rectangle((5, 5), 1, 4)
patch.rotation_point = 'center'

# generate the path to follow
path_to_follow = mpat.Arc((5, 5), 2, 2)
ax.add_patch(path_to_follow)


def init():
patch.set(x=5, y=5)
ax.add_patch(patch)
return patch,


def animate(i, ax):
new_x = 5 + np.sin(np.radians(i)) - 0.5 # parametric form for the circle
new_y = 5 + np.cos(np.radians(i)) - 2
patch.set(x=new_x, y=new_y, angle=90-i)
return patch,


anim = animation.FuncAnimation(fig, animate,
init_func=init,
fargs=[ax],
frames=360,
interval=10,
blit=True)

plt.show()

矩形跟随一个圆,但是一个参数化的圆。有没有可能让它走任何路径?

换句话说,我想知道是否有其他更简单的方法可以做到这一点(让我的补丁跟随我的路径,这里是一个圆圈),以及是否可以推广到其他路径。

提前致谢!

我在 matplotlib 文档中搜索了一种为给定路径提供参数形式的方法(但显然没有),或者是一种直接沿路径移动补丁的方法(显然没有)。

最佳答案

这是使用 matplotlib.path.Path 的一种方法生成一条路径,其顶点可以使用方法cleaned获得, 沿着它移动一个补丁。

我试图展示蓝色和红色的颜色 Rectangles可以沿着(蓝色)线性路径和(红色)circular path 移动,分别是:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation, path
import matplotlib.patches as mpat

fig, ax = plt.subplots()
ax.set(xlim=(0, 10), ylim=(0, 10))

# generate a linear path
path1 = np.column_stack((np.arange(500)/50, np.arange(500)/50))

# generate a circular path
circle = path.Path.circle(center=(5, 5), radius=1)
path2 = circle.cleaned().vertices[:-3]

# create patches
patch1 = mpat.Rectangle((0, 0), 1, 3)
patch2 = mpat.Rectangle((0, 0), 1, 3, color='red', fill=None)

# plot path vertices
plt.scatter(x=path1[:, 0], y=path1[:, 1], s=2)
plt.scatter(x=path2[:, 0], y=path2[:, 1], color='red', s=2)

def init():
patch1.set(x=0, y=0)
patch2.set(x=5, y=6)
ax.add_patch(patch1)
ax.add_patch(patch2)
return [patch1, patch2]

def animate(i, ax):
j = i % 500 # path1 has shape (500, 2)
k = (i % 16) # path2 has shape (16, 2)
patch1.set(x=path1[j][0], y=path1[j][1], angle=-j)
patch2.set(x=path2[k][0], y=path2[k][1], angle=-k)
return [patch1, patch2]

anim = animation.FuncAnimation(fig, animate,
init_func=init,
fargs=[ax],
frames=360,
interval=100,
blit=True)

plt.show()

关于python - 如何沿路径移动补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74881801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com