Source code for openalea.phenomenal.tracking.polyline_utils

import numpy as np


[docs] def polyline_length(pl): return np.sum( [ np.linalg.norm(np.array(pl[k]) - np.array(pl[k + 1])) for k in range(len(pl) - 1) ] )
[docs] def polyline_quantile_coordinate(pl, q): pl = np.array(pl) d = np.diff(pl, axis=0) segdists = np.sqrt((d**2).sum(axis=1)) s = np.cumsum(segdists) / np.sum(segdists) s = np.concatenate((np.array([0]), s)) try: i_q = next(i for i, val in enumerate(s) if val >= q) except StopIteration: i_q = len(s) - 1 a, b = pl[i_q - 1], pl[i_q] q_pl = a + (b - a) * ((q - s[i_q - 1]) / (s[i_q] - s[i_q - 1])) return q_pl
[docs] def polyline_until_z(pl, z): """return the polyline section starting from height z""" # TODO : it's approximate if np.max(np.array(pl)[:, 2]) <= z: i = 0 else: i = next((i for i, pos in enumerate(pl) if pos[2] > z)) return pl[i:]
[docs] def polyline_simplification(pl, n): if len(pl) < n: return np.array(pl) return np.array([polyline_quantile_coordinate(pl, q) for q in np.linspace(0, 1, n)])