Source code for bci_framework.default_extensions.Visual_working_memory.points
import random
from math import sqrt
from typing import TypeVar, Union, List
POINT = TypeVar("(p1, p2) point")
# ----------------------------------------------------------------------
[docs]def distance(p1: POINT, p2: POINT) -> float:
"""Euclidean distance."""
return sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
# ----------------------------------------------------------------------
[docs]def point(margin: Union[float, int]) -> POINT:
"""Generate a random point, inside a fixed area."""
return [random.uniform(0 + margin / 2, 7.2 - margin / 2), random.uniform(0 + margin / 2, 13.5 - margin / 2)]
# ----------------------------------------------------------------------
[docs]def add_point(points: List[POINT], d: Union[float, int], margin: Union[float, int]) -> None:
"""Add a point that comply with the rule of minimum distance."""
M = 100
done = False
c = 0
while not done and c < M:
c += 1
p = point(margin)
for pc in points:
if distance(pc, p) < d:
done = False
break
else:
done = True
if c < M:
p[0] = p[0]
points.append(p)
# ----------------------------------------------------------------------
[docs]def get_points(N: int, d: Union[float, int], margin: Union[float, int]) -> List[POINT]:
"""Generate N points that comply with the rule of minimum distance."""
points = []
c = 0
while len(points) != N and c < 50:
c += 1
points = []
points.append(point(margin))
if N > 1:
[add_point(points, d, margin) for i in range(int(N) - 1)][-1]
if len(points) == N:
break
return points