Module sverchok.utils.surface.primitives
Expand source code
# This file is part of project Sverchok. It's copyrighted by the contributors
# recorded in the version control history of the file, available from
# its original location https://github.com/nortikin/sverchok/commit/master
#
# SPDX-License-Identifier: GPL3
# License-Filename: LICENSE
import numpy as np
from sverchok.utils.surface.core import SvSurface
from sverchok.utils.nurbs_common import SvNurbsMaths
from sverchok.utils.curve import knotvector as sv_knotvector
class SvPlane(SvSurface):
__description__ = "Plane"
def __init__(self, point, vector1, vector2):
self.point = point
self.vector1 = np.array(vector1)
self.vector2 = np.array(vector2)
self._normal = np.cross(vector1, vector2)
n = np.linalg.norm(self._normal)
self._normal = self._normal / n
self.u_bounds = (0.0, 1.0)
self.v_bounds = (0.0, 1.0)
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]
def evaluate(self, u, v):
return self.point + u*self.vector1 + v*self.vector2
def evaluate_array(self, us, vs):
us = us[np.newaxis].T
vs = vs[np.newaxis].T
return self.point + us*self.vector1 + vs*self.vector2
def gauss_curvature_array(self, us, vs):
return np.zeros_like(us, dtype=np.float64)
def normal(self, u, v):
return self._normal
def normal_array(self, us, vs):
normal = self._normal[np.newaxis].T
n = np.linalg.norm(normal)
normal = normal / n
return np.tile(normal, len(us)).T
def to_nurbs(self, implementation = SvNurbsMaths.NATIVE):
u_min, u_max = self.u_bounds
v_min, v_max = self.v_bounds
pt1 = self.evaluate(u_min, v_min)
pt2 = self.evaluate(u_min, v_max)
pt3 = self.evaluate(u_max, v_min)
pt4 = self.evaluate(u_max, v_max)
control_points = np.array([[pt1, pt2], [pt3, pt4]])
weights = np.array([[1,1], [1, 1]])
degree_u = degree_v = 1
knotvector_u = knotvector_v = sv_knotvector.generate(1, 2)
knotvector_u = u_min + (u_max - u_min) * knotvector_u
knotvector_v = v_min + (v_max - v_min) * knotvector_v
return SvNurbsMaths.build_surface(implementation,
degree_u, degree_v,
knotvector_u, knotvector_v,
control_points, weights)
Classes
class SvPlane (point, vector1, vector2)
-
Expand source code
class SvPlane(SvSurface): __description__ = "Plane" def __init__(self, point, vector1, vector2): self.point = point self.vector1 = np.array(vector1) self.vector2 = np.array(vector2) self._normal = np.cross(vector1, vector2) n = np.linalg.norm(self._normal) self._normal = self._normal / n self.u_bounds = (0.0, 1.0) self.v_bounds = (0.0, 1.0) 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] def evaluate(self, u, v): return self.point + u*self.vector1 + v*self.vector2 def evaluate_array(self, us, vs): us = us[np.newaxis].T vs = vs[np.newaxis].T return self.point + us*self.vector1 + vs*self.vector2 def gauss_curvature_array(self, us, vs): return np.zeros_like(us, dtype=np.float64) def normal(self, u, v): return self._normal def normal_array(self, us, vs): normal = self._normal[np.newaxis].T n = np.linalg.norm(normal) normal = normal / n return np.tile(normal, len(us)).T def to_nurbs(self, implementation = SvNurbsMaths.NATIVE): u_min, u_max = self.u_bounds v_min, v_max = self.v_bounds pt1 = self.evaluate(u_min, v_min) pt2 = self.evaluate(u_min, v_max) pt3 = self.evaluate(u_max, v_min) pt4 = self.evaluate(u_max, v_max) control_points = np.array([[pt1, pt2], [pt3, pt4]]) weights = np.array([[1,1], [1, 1]]) degree_u = degree_v = 1 knotvector_u = knotvector_v = sv_knotvector.generate(1, 2) knotvector_u = u_min + (u_max - u_min) * knotvector_u knotvector_v = v_min + (v_max - v_min) * knotvector_v return SvNurbsMaths.build_surface(implementation, degree_u, degree_v, knotvector_u, knotvector_v, control_points, weights)
Ancestors
Instance variables
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): return self.point + u*self.vector1 + v*self.vector2
def evaluate_array(self, us, vs)
-
Expand source code
def evaluate_array(self, us, vs): us = us[np.newaxis].T vs = vs[np.newaxis].T return self.point + us*self.vector1 + vs*self.vector2
def gauss_curvature_array(self, us, vs)
-
Expand source code
def gauss_curvature_array(self, us, vs): return np.zeros_like(us, dtype=np.float64)
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
def normal_array(self, us, vs)
-
Expand source code
def normal_array(self, us, vs): normal = self._normal[np.newaxis].T n = np.linalg.norm(normal) normal = normal / n return np.tile(normal, len(us)).T
def to_nurbs(self, implementation='NATIVE')
-
Expand source code
def to_nurbs(self, implementation = SvNurbsMaths.NATIVE): u_min, u_max = self.u_bounds v_min, v_max = self.v_bounds pt1 = self.evaluate(u_min, v_min) pt2 = self.evaluate(u_min, v_max) pt3 = self.evaluate(u_max, v_min) pt4 = self.evaluate(u_max, v_max) control_points = np.array([[pt1, pt2], [pt3, pt4]]) weights = np.array([[1,1], [1, 1]]) degree_u = degree_v = 1 knotvector_u = knotvector_v = sv_knotvector.generate(1, 2) knotvector_u = u_min + (u_max - u_min) * knotvector_u knotvector_v = v_min + (v_max - v_min) * knotvector_v return SvNurbsMaths.build_surface(implementation, degree_u, degree_v, knotvector_u, knotvector_v, control_points, weights)