""" Spline utilities for Catmull-Rom interpolation and trajectory sampling. """ import numpy as np def catmull_rom_spline(points, num_points=100): """ Calcola una Catmull-Rom spline che passa per tutti i punti dati. Args: points: lista di tuple (x, y) o (x, y, z) num_points: numero di punti da campionare lungo la curva Returns: Lista di punti campionati sulla spline """ points = np.array(points) n = len(points) if n < 4: # Troppo pochi punti per spline: restituisci la polilinea return points.tolist() # Estendi i punti per garantire la continuità agli estremi extended = np.vstack([points[0], points, points[-1]]) result = [] # Usa n-1 segmenti validi for i in range(1, n): p0, p1, p2, p3 = extended[i-1], extended[i], extended[i+1], extended[i+2] for t in np.linspace(0, 1, num_points//(n-1)): t2 = t*t t3 = t2*t # Catmull-Rom formula pt = ( 0.5 * ((2*p1) + (-p0 + p2)*t + (2*p0 - 5*p1 + 4*p2 - p3)*t2 + (-p0 + 3*p1 - 3*p2 + p3)*t3) ) result.append(pt.tolist()) return result