#!/usr/bin/env python3importmathimportmatplotlib.pyplotaspltfrommatplotlibimport animation
fromsympyimport pi, sin, cos, solve, symbols
importnumpyasnpprint('22.')
a: float=2
b: float=1
r =float(math.sqrt(a **2+ b **2))
defellipse1(x: float) ->float:
returnfloat(math.sqrt((1- x **2/ a **2) * b **2))
defellipse2(x: float) ->float:
return-ellipse1(x)
defcircle1(x: float) ->float:
returnfloat(math.sqrt(r **2- x **2))
defcircle2(x: float) ->float:
return-1* circle1(x)
frames =50
m = symbols('m', real=True)
thetas = [2* pi / frames * i for i inrange(frames)]
x0s = [r * cos(theta) for theta in thetas]
y0s = [r * sin(theta) for theta in thetas]
ms = [solve((a **2- x0 **2) * m **2+2* x0 * y0 * m +
(b **2- y0 **2), m)
for x0, y0 inzip(x0s, y0s)]
defupdate(i: int, c):
x0 = x0s[i]
y0 = y0s[i]
xs = [-r -1, r +1]
m1, m2 = ms[i]
plt.plot(xs, [m1 * (x - x0) + y0 for x in xs],
xs, [m2 * (x - x0) + y0 for x in xs])
c.center = x0, y0
fig = plt.gcf()
ax = plt.axes(xlim=(-r -1, r +1), ylim=(-r -1, r +1), aspect='equal')
xs = np.arange(-a, a, 0.1)
plt.plot(xs, [ellipse1(x) for x in xs],
xs, [ellipse2(x) for x in xs])
xs = np.arange(-r, r, 0.1)
plt.plot(xs, [circle1(x) for x in xs],
xs, [circle2(x) for x in xs])
c = plt.Circle((r, 0), 0.1)
ax.add_patch(c)
anim = animation.FuncAnimation(fig,
update,
fargs=(c,),
frames=frames,
interval=100,
repeat=True)
plt.show()
anim.save('sample22.gif', writer='imagemagick')
0 コメント:
コメントを投稿