import codecs
import math
import matplotlib
from matplotlib.animation import FuncAnimation as FA
from matplotlib.patches import Circle as mpC
from matplotlib.patches import Polygon as mpL
from matplotlib.patches import Rectangle as mpR
import matplotlib.pyplot as plt
import numpy as np
#Clear axes.
def clearAx(ax):
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
return(ax)
#Radii to print.
def printR(radii):
printR = []
for r in radii:
if r < 2e-9 :
ratio.append('0.0000')
else :
printR.append("{:.5f}".format(r))
return(printR)
#Ratio to print.
def printRatio(x, y):
ratio = []
for i in range(2305):
r = y[i]/x[i]
if r > 1e10 :
ratio.append('∞')
elif r < 1e-11 :
ratio.append('0.0000')
else :
ratio.append("{:.4f}".format(r))
return(ratio)
#Create y.
y = [-1e-6]*150 + [-1e-5, -1/5000, -1/2500] + [-0.001*i for i in range(1,1001)]
temp = reversed([1/i for i in y])
y = y + list(temp)[1:]
#y = 1/x
x = list(reversed(y))
#Ratio to print.
print_ratio = printRatio(x, y)
#Create radii.
r = [ 1/(1/abs(x[i]) + 1/abs(y[i])) for i in range(2305)]
#Radii to print.
print_r = printR(r)
fig = plt.figure(figsize = (10, 10))
ax = fig.add_subplot(xlim = (-2.02, 2.02),
ylim = (-2.02, 2.02))
ax.set_title("Differential Radius of a Rectangle", fontsize = 24)
#Remove axes and ticks.
ax = clearAx(ax)
font = {'size' : 24}
#Five artists:
#Circle, Radius Rectangle, a/b ratio, radius1, radius2
circ = mpC((0,0),
radius = 0,
edgecolor = "#55C66711",
facecolor = "#55C66711",
lw = 1,
zorder = 1)
rad = mpL(xy = [(0, 0), (0, 0)],
edgecolor = '#55C667FF',
facecolor = '#55C667FF',
ls = '-',
lw = 2,
zorder = 3)
rect = mpR((-100000, -1/100000),
height = 2/100000,
width = 200000,
edgecolor = "#481567FF",
facecolor = "#481567FF",
lw = 1,
zorder = 2)
ratio = ax.text(-1.95, -1.8, '', c = "#481567FF", ha = 'left', **font)
radius1 = ax.text(0.9, -1.6, '', c = '#55C667FF', ha = 'left', **font)
radius2 = ax.text(0.9, -1.8, '', c = '#55C667FF', ha = 'left', **font)
def init():
"""Initialize six artists."""
ax.add_patch(circ)
ax.add_patch(rad)
ax.add_patch(rect)
ratio.set_text('')
radius1.set_text('')
radius2.set_text('')
return circ, rad, rect, ratio, radius1, radius2
def animate(i):
circ.set_radius(2*r[i])
rad.set_xy([(0, 0), (2*math.cos(i/50)*r[i], 2*math.sin(i/50)*r[i])])
rect.set_xy((x[i], y[i]))
rect.set_height(2*abs(y[i]))
rect.set_width(2*abs(x[i]))
ratio.set_text("a / b : " + print_ratio[i])
radius1.set_text("Differential")
radius2.set_text("Radius : " + print_r[i])
return circ, rad, rect, ratio, radius1, radius2
#Run animation.
anim = FA(fig, animate, init_func = init, frames = 2305, interval = 8, blit = True)
#Save animation.
anim.save('2024.05.17 EC.mp4');