Esempio n. 1
0
    def test_ray(self):
        r = Ray(Point(1, 1), pi / 4)
        self.assertAlmostEqual(r.origin(), Point(1, 1))
        self.assertAlmostEqual(r.versor(), Point(1, 1) / sqrt(2))
        self.assertAlmostEqual(r.angle(), pi / 4)

        r.set_origin(Point(4, 3))
        #TODO this should maybe normalize the versor!
        r.set_versor(Point(1, -1) / sqrt(2))
        self.assertAlmostEqual(r.origin(), Point(4, 3))
        self.assertAlmostEqual(r.versor(), Point(1, -1) / sqrt(2))
        self.assertAlmostEqual(r.angle(), -pi / 4)

        r.set_points(Point(1, 1), Point(1, 3))
        self.assertFalse(r.is_degenerate())
        self.assertFalse(Ray().is_degenerate())
        self.assertAlmostEqual(r.point_at(4), Point(1, 5))

        #TODO I think this should be expected behaviour
        #        self.assertAlmostEqual(
        #            r.pointAt(-3),
        #            Point(1, 1)))
        self.assertAlmostEqual(r.value_at(4, 0), 1)
        self.assertAlmostEqual(r.value_at(4, 1), 5)

        roots = r.roots(3, 1)
        for root in roots:
            self.assertAlmostEqual(r.value_at(root, 1), 3)

        self.assertAlmostEqual(
            r.point_at(3) - r.origin(),
            r.origin() - r.reverse().point_at(3))

        self.assertAlmostEqual(Ray.distance(Point(), r), sqrt(2))
        self.assertAlmostEqual(Ray.distance(Point() + r.versor(), r), 1)

        self.assertTrue(Ray.are_near(Point(), r, 2))
        self.assertFalse(Ray.are_near(Point(), r))
        self.assertTrue(Ray.are_same(r, r))

        q = Ray(r.origin(), r.angle())
        self.assertTrue(Ray.are_same(r, q))

        q.set_origin(r.origin() + Point(0, 1))
        self.assertFalse(Ray.are_same(r, q))
        #TODO shouldn't this really be 0?
        self.assertAlmostEqual(Ray.angle_between(r, q), 2 * pi)

        q.set_versor(Point(1, 0))
        q.set_origin(r.origin())
        self.assertAlmostEqual(
            Point(1, 1) / sqrt(2),
            Ray.make_angle_bisector_ray(q, r).versor())

        q.set_angle(pi / 7)
        self.assertAlmostEqual(q.angle(), pi / 7)

        self.assertIsInstance(q.portion(2, 4), Curve)
        self.assertAlmostEqual(q.portion(2, 4)(0), q.point_at(2))

        self.assertIsInstance(q.segment(1, 5), LineSegment)

        self.assertAlmostEqual(q.segment(1, 5)(1), q.point_at(5))
Esempio n. 2
0
    def test_ray(self):
        r = Ray(Point(1,1), pi/4)
        self.assertAlmostEqual(r.origin(), Point(1, 1))
        self.assertAlmostEqual(r.versor(), Point(1, 1)/sqrt(2))
        self.assertAlmostEqual(r.angle(), pi/4)

        r.set_origin(Point(4, 3))
        #TODO this should maybe normalize the versor!
        r.set_versor(Point(1, -1)/sqrt(2))
        self.assertAlmostEqual(r.origin(), Point(4, 3))
        self.assertAlmostEqual(r.versor(), Point(1, -1)/sqrt(2))
        self.assertAlmostEqual(r.angle(), -pi/4)

        r.set_points(Point(1, 1), Point(1, 3))
        self.assertFalse(r.is_degenerate())
        self.assertFalse(Ray().is_degenerate())
        self.assertAlmostEqual(r.point_at(4), Point(1, 5))

        #TODO I think this should be expected behaviour
#        self.assertAlmostEqual(
#            r.pointAt(-3),
#            Point(1, 1)))
        self.assertAlmostEqual(r.value_at(4, 0), 1)
        self.assertAlmostEqual(r.value_at(4, 1), 5)

        roots = r.roots( 3, 1 )
        for root in roots:
            self.assertAlmostEqual( r.value_at(root, 1), 3)

        self.assertAlmostEqual(
            r.point_at(3) - r.origin(),
            r.origin()-r.reverse().point_at(3))

        self.assertAlmostEqual(Ray.distance(Point(), r), sqrt(2))
        self.assertAlmostEqual(Ray.distance(Point()+r.versor(), r), 1)

        self.assertTrue(Ray.are_near(Point(), r, 2))
        self.assertFalse(Ray.are_near(Point(), r))
        self.assertTrue(Ray.are_same(r, r))

        q = Ray(r.origin(), r.angle())
        self.assertTrue(Ray.are_same(r, q))

        q.set_origin(r.origin()+Point(0, 1))
        self.assertFalse(Ray.are_same(r, q))
        #TODO shouldn't this really be 0?
        self.assertAlmostEqual(Ray.angle_between(r, q), 2*pi)

        q.set_versor(Point(1, 0))
        q.set_origin(r.origin())
        self.assertAlmostEqual(
            Point(1, 1)/sqrt(2),
            Ray.make_angle_bisector_ray(q, r).versor())

        q.set_angle(pi/7)
        self.assertAlmostEqual(q.angle(), pi/7)

        self.assertIsInstance(q.portion(2, 4), Curve)
        self.assertAlmostEqual(q.portion(2, 4)(0), q.point_at(2))

        self.assertIsInstance(q.segment(1, 5), LineSegment)

        self.assertAlmostEqual(q.segment(1, 5)(1), q.point_at(5))