Source code for pyllusion.movement.movement_matrix

import numpy as np


[docs]def movement_matrix( n_frames=10, n=50, angle=None, speed=None, keep_in_window=False, keep_in_circle=False, **kwargs ): """ """ if angle is None: angle = np.random.uniform(0, 360, size=n) elif isinstance(angle, (int, float)): angle = np.array([angle] * n) if speed is None: speed = np.random.uniform(0, 10, size=n) elif isinstance(speed, (int, float)): speed = np.array([speed] * n) y_movement = np.sin(np.radians(angle)) * speed / 200 x_movement = np.cos(np.radians(angle)) * speed / 200 # Mask sanitization if keep_in_window is True: keep_in_window = 1 if keep_in_circle is True: keep_in_circle = 1 # Initialize arrays x = np.zeros((n_frames, n)) y = np.zeros((n_frames, n)) # Starting locations if keep_in_circle is not False: a = np.random.uniform(0, 1, n) * 2 * np.pi r = keep_in_circle * np.sqrt(np.random.uniform(0, 1, n)) x[0] = r * np.cos(a) y[0] = r * np.sin(a) else: x[0] = np.random.uniform(-1, 1, n) y[0] = np.random.uniform(-1, 1, n) for frame in range(1, n_frames): # Add movement x[frame] = x[frame - 1] + x_movement y[frame] = y[frame - 1] + y_movement # Deal with teleportation if keep_in_window is not False: idx = np.abs(x[frame]) > keep_in_window | np.abs(y[frame]) > keep_in_window x[frame][idx] = -1 * x[frame][idx] y[frame][idx] = -1 * y[frame][idx] if keep_in_circle is not False: idx = np.sqrt((x[frame] - 0) ** 2 + (y[frame] - 0) ** 2) > keep_in_circle x[frame][idx] = -1 * x[frame][idx] y[frame][idx] = -1 * y[frame][idx] return x, y