add old stereograph_notes script
This commit is contained in:
parent
6f34d0ca0d
commit
e3f4bb83c8
93
posts/stereo/2/stereograph_notes.py
Normal file
93
posts/stereo/2/stereograph_notes.py
Normal file
@ -0,0 +1,93 @@
|
||||
from sympy import symbols, I, im, re, sympify, plot_parametric, sin, cos
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib import animation
|
||||
|
||||
class LazyList:
|
||||
def __init__(self, generator):
|
||||
self._list = []
|
||||
self._generator = generator
|
||||
|
||||
def __getitem__(self, idx):
|
||||
final = idx
|
||||
if isinstance(idx, slice):
|
||||
final = idx.stop
|
||||
while final >= len(self._list):
|
||||
self._list.append(next(self._generator))
|
||||
return self._list[idx]
|
||||
|
||||
def __repr__(self):
|
||||
if len(self._list):
|
||||
return repr(self._list)[:-1] + ", ...]"
|
||||
return "[...]"
|
||||
|
||||
t = symbols('t', real=True)
|
||||
|
||||
e = (1 + I*t) / (1 - I*t)
|
||||
|
||||
def generate_es():
|
||||
ret = sympify(1)
|
||||
while True:
|
||||
yield ret
|
||||
ret = (ret * e).expand().cancel().simplify()
|
||||
|
||||
es = LazyList(generate_es())
|
||||
cs = LazyList(map(lambda x: re(x).simplify(), es))
|
||||
ss = LazyList(map(lambda x: im(x).simplify(), es))
|
||||
|
||||
|
||||
def make_animation(fig, frames, **kwargs):
|
||||
#fig.tight_layout()
|
||||
#why isn't this how the function is exposed by default
|
||||
return lambda func: animation.FuncAnimation(fig, func, frames, init_func=lambda: None, **kwargs)
|
||||
|
||||
def bindfig(fig):
|
||||
def ret(**kwargs):
|
||||
for i, j in kwargs.items():
|
||||
if i == "figsize":
|
||||
if j is not None:
|
||||
fig.set_figwidth(j[0])
|
||||
fig.set_figheight(j[1])
|
||||
continue
|
||||
fig.__dict__["set_" + i](j)
|
||||
return fig
|
||||
return ret
|
||||
|
||||
def anim_curves(stuff=[], interval=200):
|
||||
#zero[0,0] = 1
|
||||
fig = plt.gcf()
|
||||
#plt.colorbar()
|
||||
|
||||
#temp = plt.figure
|
||||
#I hate doing it, but there's no other way to get the figure before it's plotted
|
||||
plt.figure = bindfig(fig)
|
||||
|
||||
@make_animation(fig, len(stuff), interval=interval)
|
||||
def ret(fr):
|
||||
fig.clf()
|
||||
idx1, idx2 = stuff[fr]
|
||||
|
||||
plot_parametric(idx1, idx2, xlim=(-2,2), ylim=(-2,2), backend='matplotlib')
|
||||
#plt.title(f"$x = c_{{{idx1}}}c_{{{idx2}}}; y = c_{{{idx1}}}s_{{{idx2}}}$")
|
||||
plt.tight_layout()
|
||||
|
||||
return ret
|
||||
|
||||
plot_roses = lambda roses: anim_curves([(cs[i]*cs[j], cs[i]*ss[j]) for i,j in roses], interval=500)
|
||||
#plot_roses([(1,1),(1,2),(2,1),(3,1),(3,2),(2,3),(1,3),(1,4),(3,4),(4,3),(4,1)]).save()
|
||||
|
||||
def archimedes_frames():
|
||||
writer = animation.writers['ffmpeg'](fps=15, metadata={'artist': 'Me'})
|
||||
#fig = plt.gcf()
|
||||
|
||||
for i in range(10):
|
||||
#for i in range(1):
|
||||
i += 1
|
||||
p = plot_parametric(t*cos(t), t*sin(t), xlim=(-4,4), ylim=(-4,4), label="Archimedean Spiral", show=False)
|
||||
p.save(f"frame{i}.png")
|
||||
p.extend(
|
||||
plot_parametric(2*i*t*cs[i], 2*i*t*ss[i], line_color="black", label=f"$R_{{{i}}}(t) = {2*i}t$",
|
||||
show=False)
|
||||
)
|
||||
p.legend = True
|
||||
p.save(f"frame%02d.png" % i)
|
||||
Loading…
x
Reference in New Issue
Block a user