79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
from math import atan2
|
|
from typing import List, Tuple, Union
|
|
|
|
from matplotlib import pyplot as plt
|
|
from lib import variables as V
|
|
|
|
import numpy as np
|
|
|
|
class Trajectory(object):
|
|
|
|
@property
|
|
def vertices(self):
|
|
return self._vertices
|
|
|
|
@property
|
|
def xy_vertices(self):
|
|
return [(x,y) for _, x,y in self._vertices]
|
|
|
|
@property
|
|
def endpoints(self):
|
|
return self.start, self.dest
|
|
|
|
@property
|
|
def start(self):
|
|
return self._vertices[0]
|
|
|
|
@property
|
|
def dest(self):
|
|
return self._vertices[-1]
|
|
|
|
@property
|
|
def xs(self):
|
|
return [x[1] for x in self._vertices]
|
|
|
|
@property
|
|
def ys(self):
|
|
return [x[0] for x in self._vertices]
|
|
|
|
@property
|
|
def as_paired_list(self):
|
|
return list(zip(self._vertices[:-1], self._vertices[1:]))
|
|
|
|
@property
|
|
def np_vertices(self):
|
|
return [np.array(vertice) for vertice in self._vertices]
|
|
|
|
def __init__(self, vertices: Union[List[Tuple[int]], None] = None):
|
|
assert any((isinstance(vertices, list), vertices is None))
|
|
if vertices is not None:
|
|
self._vertices = vertices
|
|
pass
|
|
|
|
def is_equal_to(self, other_trajectory):
|
|
# ToDo: do further equality Checks here
|
|
return self._vertices == other_trajectory.vertices
|
|
|
|
def draw(self, highlights=True, label=None, **kwargs):
|
|
if label is not None:
|
|
kwargs.update(color='red' if label == V.HOMOTOPIC else 'green',
|
|
label='Homotopic' if label == V.HOMOTOPIC else 'Alternative')
|
|
if highlights:
|
|
kwargs.update(marker='bo')
|
|
fig, ax = plt.gcf(), plt.gca()
|
|
img = plt.plot(self.xs, self.ys, **kwargs)
|
|
return dict(img=img, fig=fig, ax=ax)
|
|
|
|
def min_vertices(self, vertices):
|
|
vertices, last_angle = [self.start], 0
|
|
for (x1, y1), (x2, y2) in self.as_paired_list:
|
|
current_angle = atan2(x1-x2, y1-y2)
|
|
if current_angle != last_angle:
|
|
vertices.append((x2, y2))
|
|
last_angle = current_angle
|
|
else:
|
|
continue
|
|
if vertices[-1] != self.dest:
|
|
vertices.append(self.dest)
|
|
return self.__class__(vertices=vertices)
|