Source code for pymead.utils.downsampling_schemes

import numpy as np
import numpy.linalg as ln


[docs] def fractal_downsampler2(pos, ratio_thresh=None, abs_thresh=None): """ Source: https://kaushikghose.wordpress.com/2017/11/25/adaptively-downsampling-a-curve/ """ if ratio_thresh is None: ratio_thresh = 1.001 if abs_thresh is None: abs_thresh = 0.1 d = np.diff(pos, axis=0) adaptive_pos = [pos[0, :]] last_n = 0 for n in range(1, pos.shape[0]): if n == last_n: continue line_d = ln.norm(pos[n, :] - pos[last_n, :]) curve_d = ln.norm(d[last_n:n, :], axis=1).sum() if curve_d / line_d > ratio_thresh or abs(curve_d - line_d) > abs_thresh: adaptive_pos.append(pos[n - 1, :]) last_n = n - 1 adaptive_pos.append(pos[-1, :]) return np.vstack(adaptive_pos)
if __name__ == '__main__': from pymead.core.airfoil import Airfoil import matplotlib.pyplot as plt airfoil = Airfoil() airfoil.get_coords(body_fixed_csys=True) ds = fractal_downsampler2(airfoil.coords, ratio_thresh=1.0000001, abs_thresh=0.1) print(f"Number of down-sampled points: {len(ds)}") fig, axs = plt.subplots() axs.plot(ds[:, 0], ds[:, 1], marker='o') # axs.set_aspect('equal') plt.show()