def normal_array(self, us, vs): numerator, denominator = self.fraction(0, 0, us, vs) surface = nurbs_divide(numerator, denominator) numerator_u, denominator_u = self.fraction(1, 0, us, vs) numerator_v, denominator_v = self.fraction(0, 1, us, vs) surface_u = nurbs_divide(numerator_u - surface * denominator_u, denominator) surface_v = nurbs_divide(numerator_v - surface * denominator_v, denominator) normal = np.cross(surface_u, surface_v) n = np.linalg.norm(normal, axis=1, keepdims=True) normal = nurbs_divide(normal, n) return normal
def derivatives_data_array(self, us, vs): numerator, denominator = self.fraction(0, 0, us, vs) surface = nurbs_divide(numerator, denominator) numerator_u, denominator_u = self.fraction(1, 0, us, vs) numerator_v, denominator_v = self.fraction(0, 1, us, vs) surface_u = (numerator_u - surface * denominator_u) / denominator surface_v = (numerator_v - surface * denominator_v) / denominator return SurfaceDerivativesData(surface, surface_u, surface_v)
def curvature_calculator(self, us, vs, order=True): numerator, denominator = self.fraction(0, 0, us, vs) surface = nurbs_divide(numerator, denominator) numerator_u, denominator_u = self.fraction(1, 0, us, vs) numerator_v, denominator_v = self.fraction(0, 1, us, vs) surface_u = (numerator_u - surface * denominator_u) / denominator surface_v = (numerator_v - surface * denominator_v) / denominator normal = np.cross(surface_u, surface_v) n = np.linalg.norm(normal, axis=1, keepdims=True) normal = normal / n numerator_uu, denominator_uu = self.fraction(2, 0, us, vs) surface_uu = (numerator_uu - 2 * surface_u * denominator_u - surface * denominator_uu) / denominator numerator_vv, denominator_vv = self.fraction(0, 2, us, vs) surface_vv = (numerator_vv - 2 * surface_v * denominator_v - surface * denominator_vv) / denominator numerator_uv, denominator_uv = self.fraction(1, 1, us, vs) surface_uv = (numerator_uv - surface_v * denominator_u - surface_u * denominator_v - surface * denominator_uv) / denominator nuu = (surface_uu * normal).sum(axis=1) nvv = (surface_vv * normal).sum(axis=1) nuv = (surface_uv * normal).sum(axis=1) duu = np.linalg.norm(surface_u, axis=1)**2 dvv = np.linalg.norm(surface_v, axis=1)**2 duv = (surface_u * surface_v).sum(axis=1) calc = SurfaceCurvatureCalculator(us, vs, order=order) calc.set(surface, normal, surface_u, surface_v, duu, dvv, duv, nuu, nvv, nuv) return calc
def evaluate_array(self, ts): numerator, denominator = self.fraction(0, ts) # if (denominator == 0).any(): # print("Num:", numerator) # print("Denom:", denominator) return nurbs_divide(numerator, denominator)
def evaluate_array(self, us, vs): numerator, denominator = self.fraction(0, 0, us, vs) return nurbs_divide(numerator, denominator)