Exemplo n.º 1
0
    def test_circle_equal_1(self):
        circle1 = SvCircle(Matrix(), 1.0)
        x = np.array([1, 0, 0])
        origin = np.array([0, 0, 0])
        z = np.array([0, 0, 1])
        circle2 = SvCircle(center=origin, normal=z, vectorx=x)

        ts = np.linspace(0, pi / 2, num=50)

        pts1 = circle1.evaluate_array(ts)
        pts2 = circle2.evaluate_array(ts)
        self.assert_numpy_arrays_equal(pts1, pts2, precision=8)
Exemplo n.º 2
0
class SvConstPipeSurface(SvSurface):
    __description__ = "Pipe"

    def __init__(self, curve, radius, algorithm = FRENET, resolution=50):
        self.curve = curve
        self.radius = radius
        self.circle = SvCircle(Matrix(), radius)
        self.algorithm = algorithm
        self.normal_delta = 0.001
        self.u_bounds = self.circle.get_u_bounds()
        if algorithm in {FRENET, ZERO, TRACK_NORMAL}:
            self.calculator = DifferentialRotationCalculator(curve, algorithm, resolution)

    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.curve.get_u_bounds()[0]

    def get_v_max(self):
        return self.curve.get_u_bounds()[1]

    def evaluate(self, u, v):
        return self.evaluate_array(np.array([u]), np.array([v]))[0]

    def get_matrix(self, tangent):
        return MathutilsRotationCalculator.get_matrix(tangent, scale=1.0,
                axis=2,
                algorithm = self.algorithm,
                scale_all=False)

    def get_matrices(self, ts):
        if self.algorithm in {FRENET, ZERO, TRACK_NORMAL}:
            return self.calculator.get_matrices(ts)
        elif self.algorithm in {HOUSEHOLDER, TRACK, DIFF}:
            tangents = self.curve.tangent_array(ts)
            matrices = np.vectorize(lambda t : self.get_matrix(t), signature='(3)->(3,3)')(tangents)
            return matrices
        else:
            raise Exception("Unsupported algorithm")

    def evaluate_array(self, us, vs):
        profile_vectors = self.circle.evaluate_array(us)
        u_min, u_max = self.circle.get_u_bounds()
        v_min, v_max = self.curve.get_u_bounds()
        profile_vectors = np.transpose(profile_vectors[np.newaxis], axes=(1, 2, 0))
        extrusion_start = self.curve.evaluate(v_min)
        extrusion_points = self.curve.evaluate_array(vs)
        extrusion_vectors = extrusion_points - extrusion_start

        matrices = self.get_matrices(vs)

        profile_vectors = (matrices @ profile_vectors)[:,:,0]
        result = extrusion_vectors + profile_vectors
        result = result + extrusion_start
        return result
Exemplo n.º 3
0
 def test_circle_2(self):
     circle = SvCircle(Matrix(), 1.0)
     t_max = pi + 0.3
     circle.u_bounds = (0, t_max)
     nurbs = circle.to_nurbs()
     ts = np.array([0, pi / 2, pi, t_max])
     points = nurbs.evaluate_array(ts)
     expected_points = circle.evaluate_array(ts)
     self.assert_numpy_arrays_equal(points, expected_points, precision=6)