import numpy as np
from ..image import image_circle, image_circles
from .movement_matrix import movement_matrix
[docs]def motiontransparency_images(parameters=None, width=800, height=500, **kwargs):
"""
>>> import pyllusion
>>>
>>> parameters = pyllusion.motiontransparency_parameters(angle=45, duration=4, n=100, fps=20, speed=2)
>>> images = pyllusion.motiontransparency_images(parameters) #doctest: +ELLIPSIS
- 0.00% ...
>>> # pyllusion.images_to_gif(images, path="Transparency_From_Motion.gif", fps=parameters["FPS"])
"""
if parameters is None:
parameters = motiontransparency_parameters(**kwargs)
# Adjust for screen ratio
if width is not None and height is not None:
parameters["x"] = parameters["x"] * (height / width)
# Generate PIL images
images = []
for i in range(parameters["n_Frames"]):
# Print progression
if i % 10 == 0:
print("- %.2f%%" % (i / parameters["n_Frames"] * 100))
# Background circle
image = image_circle(
width=width,
height=height,
size=1,
color="grey",
outline=0,
color_outline="red",
background=(100, 100, 100),
antialias=True,
)
# Draw points
image = image_circles(
image=image,
n=parameters["n_Points"],
x=parameters["x"][i],
y=parameters["y"][i],
color="black",
background="grey",
size=0.015,
antialias=False,
)
images.append(image)
return images
[docs]def motiontransparency_parameters(angle=None, n=200, duration=0.5, fps=60, speed=1):
"""
"""
n_frames = int(duration * fps)
if angle is None:
angle = np.random.uniform(0, 360)
angles = np.array([angle] * int(n / 2) + [180 + angle] * int(n / 2))
x, y = movement_matrix(
n=n,
n_frames=n_frames,
angle=angles,
speed=speed,
keep_in_window=False,
keep_in_circle=0.5,
)
parameters = {
"x": x,
"y": y,
"Angle": angle,
"Speed": speed,
"Duration": duration,
"FPS": fps,
"n_Frames": n_frames,
"n_Points": n,
}
return parameters