Beispiel #1
0
    def test_intersection_roundingerror(self):
        # ref #2983, #5568

        v1 = (25.0, 200.0)
        v2 = (25.0, 400.0)
        v3 = (36.75, 300.0)
        result = [25.0, 300.0]

        def almost(a, b):
            # 300.0 sometimes is 299.9.. or 300.1.. however
            # we just want to know that it's really close
            self.assertIsNotNone(a)
            self.assertIsNotNone(b)
            self.assertAlmostEqual(a[0], b[0], places=0)
            self.assertAlmostEqual(a[1], b[1], places=0)

        for i in range(1, 100):
            st = "6.4" + "9" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "6.1" + "1" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "6.4" + "4" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "300.4" + "9" * i
            v = (6.5, float(st))
            almost(result, Vector.segment_intersection(v1, v2, v3, v))
Beispiel #2
0
    def test_intersection_roundingerror(self):
        # ref #2983, #5568

        v1 = (25.0, 200.0)
        v2 = (25.0, 400.0)
        v3 = (36.75, 300.0)
        result = [25.0, 300.0]

        def almost(a, b):
            # 300.0 sometimes is 299.9.. or 300.1.. however
            # we just want to know that it's really close
            self.assertIsNotNone(a)
            self.assertIsNotNone(b)
            self.assertAlmostEqual(a[0], b[0], places=0)
            self.assertAlmostEqual(a[1], b[1], places=0)

        for i in range(1, 100):
            st = "6.4" + "9" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "6.1" + "1" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "6.4" + "4" * i
            v = (float(st), 300.0)
            almost(result, Vector.segment_intersection(v1, v2, v3, v))

        for i in range(1, 100):
            st = "300.4" + "9" * i
            v = (6.5, float(st))
            almost(result, Vector.segment_intersection(v1, v2, v3, v))
Beispiel #3
0
    def update_arrow(self, _dt):
        if not self.stones_center:
            return
        sx, sy = self.stones_center
        cw, ch = self.camera.size
        cw = float(cw)
        ch = float(ch)

        lines = [[(50, -100), (50, ch + 100)],
                 [(-100, ch - 50), (cw + 100, ch - 50)],
                 [(cw - 50, ch + 100), (cw - 50, -100)],
                 [(cw + 100, 50), (- 100, 50)]]

        wcx, wcy = self.camera.get_camera_center()

        arrow_tip = None

        for v1, v2 in lines:
            # line of boundary in world coordinates
            wv1 = self.camera.convert_from_screen_to_world(v1)
            wv2 = self.camera.convert_from_screen_to_world(v2)

            # line from center camera to center of stones
            ws1 = (float(wcx), float(wcy))
            ws2 = (float(sx), float(sy))

            # intersection between them
            intersection = Vector.segment_intersection(wv1, wv2, ws1, ws2)
            if intersection:
                arrow_tip = intersection
                self.arrow_angle = (Vector(ws2) - (ws1)).angle((0, 100))
                break

        self.arrow_tip = arrow_tip
Beispiel #4
0
    def collide_rectangle(self, rect):
        # check if any sides intersect

        for s_side in self.get_sides():
            for r_side in rect.get_sides():
                if Vector.segment_intersection(s_side[0], s_side[1], r_side[0],
                                               r_side[1]) is not None:
                    return True

        # check if all rect vertexes are inside self
        for v_r in rect.get_vertexes():
            if not self.collide_point(v_r):
                return False
        # rect is inside the rectangle
        return True
Beispiel #5
0
 def collide_line_segment(self, v1, v2):
     for side in self.get_sides():
         if Vector.segment_intersection(side[0], side[1], v1,
                                        v2) is not None:
             return True
     return self.collide_point(v1) and self.collide_point(v2)