Beispiel #1
0
 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
Beispiel #2
0
 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)
Beispiel #3
0
    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
Beispiel #4
0
 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)
Beispiel #5
0
 def evaluate_array(self, us, vs):
     numerator, denominator = self.fraction(0, 0, us, vs)
     return nurbs_divide(numerator, denominator)