Skip to content

Commit 3735894

Browse files
authored
Merge pull request #50 from aesee/feature
Collision Detection : Broad Phase algorithm
2 parents 9aa3851 + 1769731 commit 3735894

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed

pygorithm/geometry/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"""
2+
Collection of special geometry functions
3+
"""
4+
from . import rect_broad_phase
5+
6+
__all__ = [
7+
'collision_detection.py'
8+
]

pygorithm/geometry/modules.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""
2+
List all modules
3+
"""
4+
import pkgutil
5+
6+
def modules():
7+
import pygorithm.geometry
8+
package = pygorithm.geometry
9+
modules = []
10+
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
11+
modules.append(modname)
12+
modules.remove('modules')
13+
modules.sort()
14+
return modules
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"""
2+
Author: ALEXEY SARAPULOV
3+
Created On: 23 August 2017
4+
"""
5+
6+
# To test if two rectangle intersect, we only have to find out
7+
# if their projections intersect on all of the coordinate axes
8+
9+
import inspect
10+
11+
12+
class Coord:
13+
"""Coord
14+
Class to initialize Coordinate of one point
15+
"""
16+
17+
def __init__(self, x, y):
18+
self.x = x
19+
self.y = y
20+
21+
22+
class SimpleRectangle:
23+
"""SimpleRectangle
24+
Class to initialize Body of Object
25+
"""
26+
27+
def __init__(self, coord1, coord2):
28+
"""
29+
:type coord1: object of class Coord
30+
:type coord2: object of class Coord
31+
"""
32+
self.min_x = coord1.x
33+
self.min_y = coord1.y
34+
self.max_x = coord2.x
35+
self.max_y = coord2.y
36+
37+
38+
def broad_phase(simpleRect1, simpleRect2):
39+
"""
40+
:type simpleRect1: object
41+
:type simpleRect2: object
42+
"""
43+
d1x = simpleRect2.min_x - simpleRect1.max_x
44+
d1y = simpleRect2.min_y - simpleRect1.max_y
45+
d2x = simpleRect1.min_x - simpleRect2.max_x
46+
d2y = simpleRect1.min_y - simpleRect2.max_y
47+
48+
if d1x > 0 or d1y > 0:
49+
return False
50+
51+
if d2x > 0 or d2y > 0:
52+
return False
53+
54+
return True
55+
56+
57+
def get_code():
58+
"""
59+
returns the code for the broad phase function
60+
"""
61+
return inspect.getsource(broad_phase)

tests/test_geometry.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import unittest
2+
3+
from pygorithm.geometry import (
4+
rect_broad_phase
5+
)
6+
7+
8+
class TestCollisionDetection(unittest.TestCase):
9+
def setUp(self):
10+
# first pair of objects
11+
self.coord1 = rect_broad_phase.Coord(1, 1)
12+
self.coord2 = rect_broad_phase.Coord(6, 8)
13+
self.simpleRect1 = rect_broad_phase.SimpleRectangle(self.coord1, self.coord2)
14+
self.coord3 = rect_broad_phase.Coord(4, 0)
15+
self.coord4 = rect_broad_phase.Coord(7, 4)
16+
self.simpleRect2 = rect_broad_phase.SimpleRectangle(self.coord3, self.coord4)
17+
# second pair
18+
self.coord1 = rect_broad_phase.Coord(1, 1)
19+
self.coord2 = rect_broad_phase.Coord(2, 3)
20+
self.simpleRect3 = rect_broad_phase.SimpleRectangle(self.coord1, self.coord2)
21+
self.coord3 = rect_broad_phase.Coord(4, 3)
22+
self.coord4 = rect_broad_phase.Coord(7, 8)
23+
self.simpleRect4 = rect_broad_phase.SimpleRectangle(self.coord3, self.coord4)
24+
25+
26+
class TestBroadPhase(TestCollisionDetection):
27+
def test_collision_detect(self):
28+
self.assertTrue(rect_broad_phase.broad_phase(self.simpleRect1, self.simpleRect2))
29+
self.assertFalse(rect_broad_phase.broad_phase(self.simpleRect3, self.simpleRect4))
30+
31+
if __name__ == '__main__':
32+
unittest.main()

0 commit comments

Comments
 (0)