123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- """Interpolate a 2D surface through a set of points"""
- import numpy as np
- from scipy.spatial import distance_matrix
- from vedo import Grid, Points, Lines, show
- np.random.seed(1)
- def harmonic_shepard(pts, vals, radius):
- dists = distance_matrix(pts, pts) + radius
- rdists = 1.0 / dists
- sum_vals = np.sum(rdists * vals, axis=1)
- return sum_vals / np.sum(rdists, axis=1)
- # Create a grid of points
- surf = Grid(res=[25,25])
- # Pick n random points on the surface
- ids = np.random.randint(0, surf.npoints, 10)
- pts = surf.coordinates[ids]
- # Create a set of random scalars
- scals1 = np.random.randn(10) * 0.1
- ptss1 = pts.copy()
- ptss1[:,2] = scals1 # assign scalars as z-coords
- pts1 = Points(ptss1).color("red5").point_size(15)
- # Compute an interpolated (smoothed) set of scalars
- scals2 = harmonic_shepard(pts, scals1, radius=0.1)
- ptss2 = pts.copy()
- ptss2[:,2] = scals2
- pts2 = Points(ptss2).color("purple5").point_size(15)
- # Warp the surface to match the interpolated points
- ptsource, pttarget = [], []
- for pt in pts2.coordinates:
- pt_surf = surf.closest_point(pt)
- ptsource.append(pt_surf)
- pttarget.append(pt)
- warped = surf.warp(ptsource, pttarget, mode='2d')
- warped.color("b4").lc('lightblue').wireframe(False).lw(1)
- lines = Lines(pts1, pts2, lw=2)
- show(pts1, pts2, lines, warped, __doc__, axes=1, viewup="z").close()
|