1
2
3 """Tests for collision"""
4
5 from sys import path
6 path.extend(['.', '..','../..'])
7
8 import unittest
9 from mosp import collide
10 from math import sqrt
11
12 __author__ = "F. Ludwig, P. Tute"
13 __maintainer__ = "B. Henne"
14 __contact__ = "henne@dcsec.uni-hannover.de"
15 __copyright__ = "(c) 2010-2011, DCSec, Leibniz Universitaet Hannover, Germany"
16 __license__ = "GPLv3"
17
18
20 """Tests mosp.collide basic functions."""
21
23 """Test Line.closest_to_point with four Lines w/different angles."""
24 h = collide.Line(2.0, 5.0, 8.0, 5.0)
25 self.assertEqual(h.closest_to_point( 0.0, 0.0), (2,5))
26 self.assertEqual(h.closest_to_point( 5.0, 0.0), (5,5))
27 self.assertEqual(h.closest_to_point(10.0, 0.0), (8,5))
28 self.assertEqual(h.closest_to_point(10.0, 5.0), (8,5))
29 self.assertEqual(h.closest_to_point(10.0,10.0), (8,5))
30 self.assertEqual(h.closest_to_point( 5.0,10.0), (5,5))
31 self.assertEqual(h.closest_to_point( 0.0,10.0), (2,5))
32 self.assertEqual(h.closest_to_point( 0.0, 5.0), (2,5))
33 v = collide.Line(5.0, 2.0, 5.0, 8.0)
34 self.assertEqual(v.closest_to_point( 0.0, 0.0), (5,2))
35 self.assertEqual(v.closest_to_point( 5.0, 0.0), (5,2))
36 self.assertEqual(v.closest_to_point(10.0, 0.0), (5,2))
37 self.assertEqual(v.closest_to_point(10.0, 5.0), (5,5))
38 self.assertEqual(v.closest_to_point(10.0,10.0), (5,8))
39 self.assertEqual(v.closest_to_point( 5.0,10.0), (5,8))
40 self.assertEqual(v.closest_to_point( 0.0,10.0), (5,8))
41 self.assertEqual(v.closest_to_point( 0.0, 5.0), (5,5))
42 a = collide.Line(2.0, 2.0, 8.0, 8.0)
43 self.assertEqual(a.closest_to_point( 0.0, 0.0), (2,2))
44 self.assertEqual(a.closest_to_point( 5.0, 0.0), (2.5,2.5))
45 self.assertEqual(a.closest_to_point(10.0, 0.0), (5,5))
46 self.assertEqual(a.closest_to_point(10.0, 5.0), (7.5,7.5))
47 self.assertEqual(a.closest_to_point(10.0,10.0), (8,8))
48 self.assertEqual(a.closest_to_point( 5.0,10.0), (7.5,7.5))
49 self.assertEqual(a.closest_to_point( 0.0,10.0), (5,5))
50 self.assertEqual(a.closest_to_point( 0.0, 5.0), (2.5,2.5))
51 b = collide.Line(2.0, 8.0, 8.0, 2.0)
52 self.assertEqual(b.closest_to_point( 0.0, 0.0), (5,5))
53 self.assertEqual(b.closest_to_point( 5.0, 0.0), (7.5,2.5))
54 self.assertEqual(b.closest_to_point(10.0, 0.0), (8,2))
55 self.assertEqual(b.closest_to_point(10.0, 5.0), (7.5,2.5))
56 self.assertEqual(b.closest_to_point(10.0,10.0), (5,5))
57 self.assertEqual(b.closest_to_point( 5.0,10.0), (2.5,7.5))
58 self.assertEqual(b.closest_to_point( 0.0,10.0), (2,8))
59 self.assertEqual(b.closest_to_point( 0.0, 5.0), (2.5,7.5))
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
107 """Test collision of different lines with two circles.
108
109 Tests collision of lines with circles. Lines are inside circle,
110 partly inside the circle, tangent to circle, starting at circle,
111 and fully outside the circle, w/different angles and sides."""
112 w = collide.World()
113 a = collide.Line(2, 4, 4, 2)
114 b = collide.Line(4, 3, 6, 3)
115 c = collide.Line(1, 5, 6, 5)
116 d = collide.Line(3, 5, 3, 7)
117 e = collide.Line(1, 1, 2, 1)
118 f = collide.Line(-2, -2, 2, -2)
119 g = collide.Line(-5, 1, -5, -3)
120 h = collide.Line(-4, -6, 5, -6)
121 i = collide.Line(-4, -5.99, 5, -5.99)
122 j = collide.Line(-4, -6.01, 4, -6.01)
123 k = collide.Line(-5, 2, -3, 4)
124 w.update([a,b,c,d,e,f,g,h,i,j,k])
125 w.calculate_grid()
126 self.assertEqual(w.collide_circle_impl0(3,3,2), set([a, b, c, d]))
127 self.assertEqual(w.collide_circle_impl1(3,3,2), set([a, b, c, d]))
128 self.assertEqual(w.collide_circle_impl2(3,3,2), set([a, b, c, d]))
129 self.assertEqual(w.collide_circle_impl0(-1,-2,4), set([e, f, i, h, g]))
130 self.assertEqual(w.collide_circle_impl1(-1,-2,4), set([e, f, i, h, g]))
131 self.assertEqual(w.collide_circle_impl2(-1,-2,4), set([e, f, i, h, g]))
132
134 """Tests collision of cirle and points."""
135 w = collide.World()
136 a = collide.Point(1,1)
137 b = collide.Point(2,2)
138 c = collide.Point(3,3)
139 d = collide.Point(4,4)
140 e = collide.Point(5,5)
141 t = collide.Point(3,5)
142 u = collide.Point(1,3)
143 v = collide.Point(1,2.999)
144 w.update([a,b,c,d,e, t, u, v])
145 w.calculate_grid()
146 self.assertEqual(w.collide_circle_impl0(3,3,2), set([b, c, d, t, u]))
147 self.assertEqual(w.collide_circle_impl1(3,3,2), set([b, c, d, t, u]))
148 self.assertEqual(w.collide_circle_impl2(3,3,2), set([b, c, d, t, u]))
149
151 """Tests collision of lines and a rectangle."""
152 w = collide.World()
153 a = collide.Line(0,0,2,0)
154 b = collide.Line(0.5,0.5,1.5,1.5)
155 c = collide.Line(2,2,5,7)
156 d = collide.Line(1,3,-1,1)
157 e = collide.Line(-0.01,0,-0.01,2)
158 f = collide.Line(1,3,-3,-0.999)
159 w.update([a,b,c,d,e,f])
160 w.calculate_grid()
161 self.assertEqual(w.collide_rectangle(0, 0, 2, 2), set([a,b,c,d]))
162
164 """Tests collision of points and a rectangle."""
165 w = collide.World()
166 a = collide.Point(-1,-1)
167 b = collide.Point(0,0)
168 c = collide.Point(1,1)
169 d = collide.Point(2,2)
170 e = collide.Point(3,3)
171 f = collide.Point(3,5)
172 g = collide.Point(0,1)
173 h = collide.Point(2,2.0001)
174 w.update([a,b,c,d,e,f,g,h])
175 w.calculate_grid()
176 self.assertEqual(w.collide_rectangle(0, 0, 2, 2), set([b,c,d,g]))
177
178
179 if __name__ == "__main__":
180 unittest.main()
181