1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- """Use a variant of the Moving Least Squares (MLS)
- algorithm to project a cloud of points to become a smooth surface.
- In the second window we show the error estimated for
- each point in color scale (left) or in size scale (right)."""
- from vedo import *
- printc(__doc__, invert=1)
- plt1 = Plotter(N=3, axes=1)
- mesh = Mesh(dataurl+"bunny.obj").normalize().subdivide()
- pts = mesh.coordinates
- pts += np.random.randn(len(pts), 3)/20 # add noise, will not mess up the original points
- #################################### smooth cloud with MLS
- # build the mesh points
- s0 = Points(pts, r=3).color("blue")
- plt1.at(0).show(s0, "original point cloud + noise")
- # project s1 points into a smooth surface of points
- # The parameter f controls the size of the local regression.
- mls1 = s0.clone().smooth_mls_2d(f=0.5)
- plt1.at(1).show(mls1, "MLS first pass, f=0.5")
- # mls1 is an Assembly so unpack it to get the first object it contains
- mls2 = mls1.clone().smooth_mls_2d(radius=0.1)
- plt1.at(2).show(mls2, "MLS second pass, radius=0.1")
- #################################### draw errors
- plt2 = Plotter(pos=(300, 400), N=2, axes=1)
- variances = mls2.pointdata["MLSVariance"]
- vmin, vmax = np.min(variances), np.max(variances)
- print("min and max of variances:", vmin, vmax)
- vcols = [color_map(v, "jet", vmin, vmax) for v in variances] # scalars->colors
- sp0 = Spheres(mls2.coordinates, c=vcols, r=0.02) # error as color
- sp1 = Spheres(mls2.coordinates, c="red5", r=variances/4) # error as point size
- mesh.color("k").alpha(0.05).wireframe()
- plt2.at(0).show(sp0, "Use color to represent variance")
- plt2.at(1).show(sp1, "point size to represent variance", zoom=1.3, interactive=True)
- plt2.close()
- plt1.close()
|