1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- """Interpolate a vectorial field using
- Thin Plate Spline or Radial Basis Function"""
- from scipy.interpolate import Rbf
- from vedo import Plotter, Points, Arrows, show
- import numpy as np
- ls = np.linspace(0, 10, 8)
- X, Y, Z = np.meshgrid(ls, ls, ls)
- xr, yr, zr = X.ravel(), Y.ravel(), Z.ravel()
- positions = np.vstack([xr, yr, zr]).T
- sources = [(5, 8, 5), (8, 5, 5), (5, 2, 5)]
- deltas = [(1, 1, 0.2), (1, 0, -0.8), (1, -1, 0.2)]
- apos = Points(positions, r=2)
- # for p in apos.vertices: ####### Uncomment to fix some points.
- # if abs(p[2]-5) > 4.999: # differences btw RBF and thinplate
- # sources.append(p) # will become much smaller.
- # deltas.append(np.zeros(3))
- sources = np.array(sources)
- deltas = np.array(deltas)
- src = Points(sources).color("r").ps(12)
- trs = Points(sources + deltas).color("v").ps(12)
- arr = Arrows(sources, sources + deltas).color("k8")
- ################################################# warp using Thin Plate Splines
- warped = apos.clone().warp(sources, sources+deltas)
- warped.alpha(0.4).color("lg").point_size(10)
- allarr = Arrows(apos.vertices, warped.vertices).color("k8")
- set1 = [apos, warped, src, trs, arr, __doc__]
- plt1 = Plotter(N=2, bg='bb')
- plt1.at(0).show(apos, warped, src, trs, arr, __doc__)
- plt1.at(1).show(allarr)
- ################################################# RBF
- x, y, z = sources[:, 0], sources[:, 1], sources[:, 2]
- dx, dy, dz = deltas[:, 0], deltas[:, 1], deltas[:, 2]
- itrx = Rbf(x, y, z, dx) # Radial Basis Function interpolator:
- itry = Rbf(x, y, z, dy) # interoplate the deltas in each separate
- itrz = Rbf(x, y, z, dz) # cartesian dimension
- positions_x = itrx(xr, yr, zr) + xr
- positions_y = itry(xr, yr, zr) + yr
- positions_z = itrz(xr, yr, zr) + zr
- positions_rbf = np.vstack([positions_x, positions_y, positions_z]).T
- warped_rbf = Points(positions_rbf).color("lg",0.4).point_size(10)
- allarr_rbf = Arrows(apos.vertices, warped_rbf.vertices).color("k8")
- arr = Arrows(sources, sources + deltas).color("k8")
- plt2 = Plotter(N=2, pos=(200, 300), bg='bb')
- plt2.at(0).show("Radial Basis Function", apos, warped_rbf, src, trs, arr)
- plt2.at(1).show(allarr_rbf)
- plt2.interactive()
- plt2.close()
- plt1.close()
|