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))
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))
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
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
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)