|
@@ -5,7 +5,6 @@ from math import acos
|
5
|
5
|
|
6
|
6
|
from synergine2.simulation import SubjectMechanism, Subjects, Subject
|
7
|
7
|
from synergine2.simulation import Simulation as BaseSimulation
|
8
|
|
-from synergine2.xyz_utils import get_distance_between_points
|
9
|
8
|
|
10
|
9
|
|
11
|
10
|
"""
|
|
@@ -26,6 +25,61 @@ Y
|
26
|
25
|
|
27
|
26
|
COLLECTION_XYZ = 'COLLECTION_XYZ'
|
28
|
27
|
|
|
28
|
+NORTH = 11
|
|
29
|
+NORTH_EST = 12
|
|
30
|
+EST = 15
|
|
31
|
+SOUTH_EST = 18
|
|
32
|
+SOUTH = 17
|
|
33
|
+SOUTH_WEST = 16
|
|
34
|
+WEST = 13
|
|
35
|
+NORTH_WEST = 10
|
|
36
|
+
|
|
37
|
+DIRECTIONS = (
|
|
38
|
+ NORTH,
|
|
39
|
+ NORTH_EST,
|
|
40
|
+ EST,
|
|
41
|
+ SOUTH_EST,
|
|
42
|
+ SOUTH,
|
|
43
|
+ SOUTH_WEST,
|
|
44
|
+ WEST,
|
|
45
|
+ NORTH_WEST,
|
|
46
|
+)
|
|
47
|
+
|
|
48
|
+DIRECTION_FROM_NORTH_DEGREES = {
|
|
49
|
+ (0, 22.5): NORTH,
|
|
50
|
+ (22.5, 67): NORTH_EST,
|
|
51
|
+ (67, 112.5): EST,
|
|
52
|
+ (112.5, 157.5): SOUTH_EST,
|
|
53
|
+ (157.5, 202.5): SOUTH,
|
|
54
|
+ (202.5, 247.5): SOUTH_WEST,
|
|
55
|
+ (247.5, 292.5): WEST,
|
|
56
|
+ (292.5, 337.5): NORTH_WEST,
|
|
57
|
+ (337.5, 360): NORTH,
|
|
58
|
+ (337.5, 0): NORTH
|
|
59
|
+}
|
|
60
|
+
|
|
61
|
+DIRECTION_SLIGHTLY = {
|
|
62
|
+ NORTH: (NORTH_WEST, NORTH, NORTH_EST),
|
|
63
|
+ NORTH_EST: (NORTH, NORTH_EST, EST),
|
|
64
|
+ EST: (NORTH_EST, EST, SOUTH_EST),
|
|
65
|
+ SOUTH_EST: (EST, SOUTH_EST, SOUTH),
|
|
66
|
+ SOUTH: (SOUTH_EST, SOUTH, SOUTH_WEST),
|
|
67
|
+ SOUTH_WEST: (SOUTH, SOUTH_WEST, WEST),
|
|
68
|
+ WEST: (SOUTH_WEST, WEST, NORTH_WEST),
|
|
69
|
+ NORTH_WEST: (WEST, NORTH_WEST, NORTH),
|
|
70
|
+}
|
|
71
|
+
|
|
72
|
+DIRECTION_MODIFIERS = {
|
|
73
|
+ NORTH_WEST: (-1, -1, 0),
|
|
74
|
+ NORTH: (0, -1, 0),
|
|
75
|
+ NORTH_EST: (1, -1, 0),
|
|
76
|
+ WEST: (-1, 0, 0),
|
|
77
|
+ EST: (1, 0, 0),
|
|
78
|
+ SOUTH_WEST: (-1, 1, 0),
|
|
79
|
+ SOUTH: (0, 1, 0),
|
|
80
|
+ SOUTH_EST: (1, 1, 0),
|
|
81
|
+}
|
|
82
|
+
|
29
|
83
|
|
30
|
84
|
def get_degree_from_north(a, b):
|
31
|
85
|
if a == b:
|
|
@@ -57,9 +111,18 @@ class XYZSubjectMixin(object, metaclass=XYZSubjectMixinMetaClass):
|
57
|
111
|
"""
|
58
|
112
|
:param position: tuple with (x, y, z)
|
59
|
113
|
"""
|
60
|
|
- self.position = kwargs.pop('position')
|
|
114
|
+ self._position = kwargs.pop('position')
|
|
115
|
+ self.previous_direction = None
|
61
|
116
|
super().__init__(*args, **kwargs)
|
62
|
117
|
|
|
118
|
+ @property
|
|
119
|
+ def position(self):
|
|
120
|
+ return self._position
|
|
121
|
+
|
|
122
|
+ @position.setter
|
|
123
|
+ def position(self, value):
|
|
124
|
+ self._position = value
|
|
125
|
+
|
63
|
126
|
|
64
|
127
|
class ProximityMixin(object):
|
65
|
128
|
distance = 1
|
|
@@ -107,6 +170,7 @@ class ProximityMixin(object):
|
107
|
170
|
|
108
|
171
|
@classmethod
|
109
|
172
|
def get_distance_of(cls, position, subject: XYZSubjectMixin):
|
|
173
|
+ from synergine2.xyz_utils import get_distance_between_points # cyclic import
|
110
|
174
|
return get_distance_between_points(
|
111
|
175
|
position,
|
112
|
176
|
subject.position,
|