Module sverchok.utils.surface.rbf
Expand source code
import numpy as np
from mathutils import Matrix
from sverchok.utils.surface import SvSurface
##################
# #
# Surfaces #
# #
##################
class SvRbfSurface(SvSurface):
def __init__(self, rbf, coord_mode, input_orientation, input_matrix):
self.rbf = rbf
self.coord_mode = coord_mode
self.input_orientation = input_orientation
self.input_matrix = input_matrix
self.u_bounds = (0, 0)
self.v_bounds = (0, 0)
self.normal_delta = 0.0001
def get_input_orientation(self):
return self.input_orientation
def get_coord_mode(self):
return self.coord_mode
def get_u_min(self):
return self.u_bounds[0]
def get_u_max(self):
return self.u_bounds[1]
def get_v_min(self):
return self.v_bounds[0]
def get_v_max(self):
return self.v_bounds[1]
@property
def u_size(self):
return self.u_bounds[1] - self.u_bounds[0]
@property
def v_size(self):
return self.v_bounds[1] - self.v_bounds[0]
@property
def has_input_matrix(self):
return self.coord_mode == 'XY' and self.input_matrix is not None and self.input_matrix != Matrix()
def get_input_matrix(self):
return self.input_matrix
def evaluate(self, u, v):
z = self.rbf(u, v)
if self.coord_mode == 'XY':
z = np.array([u, v, z])
return z
def evaluate_array(self, us, vs):
surf_vertices = np.array( self.rbf(us, vs) )
if self.coord_mode == 'XY':
surf_vertices = np.stack((us, vs, surf_vertices)).T
return surf_vertices
def normal(self, u, v):
return self.normal_array(np.array([u]), np.array([v]))[0]
def normal_array(self, us, vs):
surf_vertices = self.evaluate_array(us, vs)
u_plus = self.evaluate_array(us + self.normal_delta, vs)
v_plus = self.evaluate_array(us, vs + self.normal_delta)
du = u_plus - surf_vertices
dv = v_plus - surf_vertices
#self.info("Du: %s", du)
#self.info("Dv: %s", dv)
normal = np.cross(du, dv)
norm = np.linalg.norm(normal, axis=1)[np.newaxis].T
#if norm != 0:
normal = normal / norm
#self.info("Normals: %s", normal)
return normal
Classes
class SvRbfSurface (rbf, coord_mode, input_orientation, input_matrix)
-
Expand source code
class SvRbfSurface(SvSurface): def __init__(self, rbf, coord_mode, input_orientation, input_matrix): self.rbf = rbf self.coord_mode = coord_mode self.input_orientation = input_orientation self.input_matrix = input_matrix self.u_bounds = (0, 0) self.v_bounds = (0, 0) self.normal_delta = 0.0001 def get_input_orientation(self): return self.input_orientation def get_coord_mode(self): return self.coord_mode def get_u_min(self): return self.u_bounds[0] def get_u_max(self): return self.u_bounds[1] def get_v_min(self): return self.v_bounds[0] def get_v_max(self): return self.v_bounds[1] @property def u_size(self): return self.u_bounds[1] - self.u_bounds[0] @property def v_size(self): return self.v_bounds[1] - self.v_bounds[0] @property def has_input_matrix(self): return self.coord_mode == 'XY' and self.input_matrix is not None and self.input_matrix != Matrix() def get_input_matrix(self): return self.input_matrix def evaluate(self, u, v): z = self.rbf(u, v) if self.coord_mode == 'XY': z = np.array([u, v, z]) return z def evaluate_array(self, us, vs): surf_vertices = np.array( self.rbf(us, vs) ) if self.coord_mode == 'XY': surf_vertices = np.stack((us, vs, surf_vertices)).T return surf_vertices def normal(self, u, v): return self.normal_array(np.array([u]), np.array([v]))[0] def normal_array(self, us, vs): surf_vertices = self.evaluate_array(us, vs) u_plus = self.evaluate_array(us + self.normal_delta, vs) v_plus = self.evaluate_array(us, vs + self.normal_delta) du = u_plus - surf_vertices dv = v_plus - surf_vertices #self.info("Du: %s", du) #self.info("Dv: %s", dv) normal = np.cross(du, dv) norm = np.linalg.norm(normal, axis=1)[np.newaxis].T #if norm != 0: normal = normal / norm #self.info("Normals: %s", normal) return normal
Ancestors
Instance variables
var has_input_matrix
-
Expand source code
@property def has_input_matrix(self): return self.coord_mode == 'XY' and self.input_matrix is not None and self.input_matrix != Matrix()
var u_size
-
Expand source code
@property def u_size(self): return self.u_bounds[1] - self.u_bounds[0]
var v_size
-
Expand source code
@property def v_size(self): return self.v_bounds[1] - self.v_bounds[0]
Methods
def evaluate(self, u, v)
-
Expand source code
def evaluate(self, u, v): z = self.rbf(u, v) if self.coord_mode == 'XY': z = np.array([u, v, z]) return z
def evaluate_array(self, us, vs)
-
Expand source code
def evaluate_array(self, us, vs): surf_vertices = np.array( self.rbf(us, vs) ) if self.coord_mode == 'XY': surf_vertices = np.stack((us, vs, surf_vertices)).T return surf_vertices
def get_coord_mode(self)
-
Expand source code
def get_coord_mode(self): return self.coord_mode
def get_input_matrix(self)
-
Expand source code
def get_input_matrix(self): return self.input_matrix
def get_input_orientation(self)
-
Expand source code
def get_input_orientation(self): return self.input_orientation
def get_u_max(self)
-
Expand source code
def get_u_max(self): return self.u_bounds[1]
def get_u_min(self)
-
Expand source code
def get_u_min(self): return self.u_bounds[0]
def get_v_max(self)
-
Expand source code
def get_v_max(self): return self.v_bounds[1]
def get_v_min(self)
-
Expand source code
def get_v_min(self): return self.v_bounds[0]
def normal(self, u, v)
-
Expand source code
def normal(self, u, v): return self.normal_array(np.array([u]), np.array([v]))[0]
def normal_array(self, us, vs)
-
Expand source code
def normal_array(self, us, vs): surf_vertices = self.evaluate_array(us, vs) u_plus = self.evaluate_array(us + self.normal_delta, vs) v_plus = self.evaluate_array(us, vs + self.normal_delta) du = u_plus - surf_vertices dv = v_plus - surf_vertices #self.info("Du: %s", du) #self.info("Dv: %s", dv) normal = np.cross(du, dv) norm = np.linalg.norm(normal, axis=1)[np.newaxis].T #if norm != 0: normal = normal / norm #self.info("Normals: %s", normal) return normal