123456789101112131415161718192021222324252627282930313233343536 |
- """1D Moving Least Squares (MLS)
- to project a cloud of unordered points
- to become a smooth, ordered line"""
- from vedo import *
- settings.default_font = "Antares"
- N = 3 # nr. of iterations
- # build some initial cloud of noisy points along a line
- pts = [(sin(6*x), cos(2*x)*x, cos(9*x)) for x in np.arange(0,2, 0.001)]
- # pts = [(0, sin(x), cos(x)) for x in np.arange(0,6, .002)]
- # pts = [(sqrt(x), sin(x), x/5) for x in np.arange(0, 16, 0.01)]
- pts += np.random.randn(len(pts), 3) / 15 # add noise
- np.random.shuffle(pts) # make sure points are not ordered
- pts = Points(pts, r=5)
- plt = Plotter(N=N, axes=1)
- plt.at(0).show(pts, __doc__, viewup='z')
- for i in range(1, N):
- pts = pts.clone().smooth_mls_1d(n=50).color(i)
- if i == N-1:
- # at the last iteration make sure points
- # are separated by tol (in % of the bounding box)
- pts.subsample(0.025)
- plt.at(i).show(pts, f"Iteration {i}, #points: {pts.npoints}")
- line = pts.generate_segments().clean().join()
- # printc("lines:", line.lines)
- plt += [line, line.labels("id").bc("blue5")]
- plt.interactive().close()
|