1
+ """
2
+ Author: Timothy Moore
3
+ Created On: 31th August 2017
4
+
5
+ Defines a 2-dimensional axis-aligned rectangle.
6
+ This rectangle does not act as a polygon, but
7
+ there are similar collision methods that accept
8
+ polygons.
9
+
10
+ Unlike Polygon2s, Rect2s are very fast to construct.
11
+ """
12
+
13
+ import math
14
+
15
+ from pygorithm .geometry import (vector2 , line2 , axisall , polygon2 )
16
+
17
+ def Rect2 (object ):
18
+ """
19
+ A rectangle. Uses SAT collision against polygons and
20
+ broad-phase collision against other rectangles.
21
+
22
+ Rectangles are fast to construct and have very fast
23
+ rectangle-rectangle collision detection.
24
+
25
+ Rect2 is designed to have almost exactly the opposite performance
26
+ characteristics as Polygon2 when doing collision against
27
+ Polygon2s: Fast to construct and complex on first call with
28
+ many operations incurring expensive recalculations.
29
+
30
+ .. caution::
31
+
32
+ Collision detection against a rectangle with cause
33
+ initialization of the polygon representation of a
34
+ rectangle. This has the noticeable performance
35
+ characteristics that are seen whenever a polygon
36
+ is constructed (see :py:class:~`pygorithm.geometry.polygon2.Polygon2`).
37
+ This operation recurrs only if width and height
38
+ were modified.
39
+
40
+ :ivar mincorner: the position of this polygon
41
+ :vartype mincorner: :class:`pygorithm.geometry.vector2.Vector2`
42
+ """
43
+
44
+ def __init__ (self , width , height , mincorner = None ):
45
+ """
46
+ Create a new rectangle of width and height.
47
+
48
+ If mincorner is None, the origin is assumed.
49
+
50
+ :param width: width of this rect
51
+ :type width: :class:`numbers.Number`
52
+ :param height: height of this rect
53
+ :type height: :class:`numbers.Number`
54
+ :param mincorner: the position of this rect
55
+ :type mincorner: :class:`pygorithm.geometry.vector2.Vector2` or None
56
+ """
57
+ pass
58
+
59
+ @property
60
+ def polygon (self ):
61
+ """
62
+ Get the polygon representation of this rectangle, without
63
+ the corners. Lazily initialized and up-to-date with width
64
+ and height.
65
+
66
+ .. caution::
67
+
68
+ This does not include the mincorner (which should be passed as
69
+ offset)
70
+
71
+ :returns: polygon representation of this rectangle
72
+ :rtype: :class:`pygorithm.geometry.polygon2.Polygon2`
73
+ """
74
+ pass
75
+
76
+ @property
77
+ def width (self ):
78
+ """
79
+ Get or set the width of this rect.
80
+
81
+ .. caution::
82
+
83
+ Setting the width of the rectangle will remove the polygon
84
+ caching required for rectangle-polygon collision.
85
+
86
+ :returns: width of this rect
87
+ :rtype: :class:`numbers.Number`
88
+ """
89
+ pass
90
+
91
+ @property .setter
92
+ def width (self , value ):
93
+ pass
94
+
95
+ @property
96
+ def height (self ):
97
+ """
98
+ Get or set the height of this rect
99
+
100
+ .. caution::
101
+
102
+ Setting the height of the rectangle will remove the cached
103
+ operations required for rectangle-polygon collision.
104
+
105
+ :returns: height of this rect
106
+ :rtype: :class:`numbers.Number`
107
+ """
108
+ pass
109
+
110
+ @property .setter
111
+ def height (self , value ):
112
+ pass
113
+
114
+ @property
115
+ def area (self ):
116
+ """
117
+ Get the area of this rect
118
+
119
+ :returns: area of this rect
120
+ :rtype: :class:`numbers.Number`
121
+ """
122
+ pass
123
+
124
+ @staticmethod
125
+ def project_onto_axis (rect , axis ):
126
+ """
127
+ Project the rect onto the specified axis.
128
+
129
+ .. tip::
130
+
131
+ This function is extremely fast for vertical or
132
+ horizontal axises.
133
+
134
+ :param rect: the rect to project
135
+ :type rect: :class:`pygorithm.geometry.rect2.Rect2`
136
+ :param axis: the axis to project onto
137
+ :type axis: :class:`pygorithm.geometry.vector2.Vector2`
138
+ :returns: the projection of the rect along axis
139
+ :rtype: :class:`pygorithm.geometry.axisall.AxisAlignedLine`
140
+ """
141
+ pass
142
+
143
+ @staticmethod
144
+ def contains_point (rect , point ):
145
+ """
146
+ Determine if the rect contains the point
147
+
148
+ Distinguish between points that are on the edge of the
149
+ rect and those that are not.
150
+
151
+ .. tip::
152
+
153
+ This will never return True, True
154
+
155
+ :param rect: the rect
156
+ :type rect: :class:`pygorithm.geometry.rect2.Rect2`
157
+ :param point: the point
158
+ :type point: :class:`pygorithm.geometry.vector2.Vector2`
159
+ :returns: point on edge, point inside
160
+ :rtype: bool, bool
161
+ """
162
+ pass
163
+
164
+ @staticmethod
165
+ def find_intersection (* args , find_mtv = True ):
166
+ """
167
+ Determine the state of intersection between a rect and a
168
+ polygon.
169
+
170
+ For Rect-Polygon intersection:
171
+
172
+ Must be passed in 3 arguments - a :py:class:~`pygorithm.geometry.rect2.Rect2`,
173
+ a :py:class:~`pygorithm.geometry.polygon2.Polygon2`, and a
174
+ :py:class:~`pygorithm.geometry.vector2.Vector2`. The vector must come immediately
175
+ after the polygon, but the rect can be either the first or last unnamed argument.
176
+ If it is the first argument, the mtv is against the rectangle. If it is the last
177
+ argument, the mtv is against the polygon.
178
+
179
+
180
+ For Rect-Rect intersection:
181
+
182
+ Must be passed in 2 ar
183
+ Examples:
184
+
185
+ .. code-block:: python
186
+
187
+ from pygorithm.geometry import (vector2, polygon2, rect2)
188
+
189
+ octogon = polygon2.Polygon2.from_regular(8, 1)
190
+ oct_offset = vector2.Vector2(0.5, 0)
191
+
192
+ unit_square = rect2.Rect2(1, 1)
193
+
194
+ # find mtv for square against octogon
195
+ touching, overlapping, mtv = rect2.Rect2.find_intersection(unit_square, octogon, oct_offset)
196
+
197
+ # find mtv for octogon against square
198
+ touching, overlapping, mtv = rect2.Rect2.find_intersection(octogon, oct_offset, unit_square)
199
+
200
+ # find intersection but skip mtv (two options)
201
+ touching, overlapping, alwaysNone = rect2.Rect2.find_intersection(unit_square, octogon, oct_offset, find_mtv=False)
202
+ touching, overlapping, alwaysNone = rect2.Rect2.find_intersection(octogon, oct_offset, unit_square, find_mtv=False)
203
+
204
+ big_square = rect2.Rect2(2, 2, vector2.Vector2(-1.5, 0))
205
+
206
+ # find mtv for square against big square
207
+ touching, overlapping, mtv = rect2.Rect2.find_intersection(unit_square, big_square)
208
+
209
+ # find mtv for big square against square
210
+ touching, overlapping, mtv = rect2.Rect2.find_intersection(big_square, unit_square)
211
+
212
+ :param args: 2 arguments for rect-rect, 3 arguments for rect-polygon (see above)
213
+ :type args: list
214
+ :param find_mtv: if mtv should be found where possible (default ``True``)
215
+ :type find_mtv: bool
216
+ :returns: (touching, overlapping, (mtv distance, mtv axis))
217
+ :rtype: (bool, bool, (:class:`numbers.Number`, :class:`pygorithm.geometry.vector2.Vector2`) or None)
218
+ """
219
+ pass
220
+
221
+ def __repr__ (self ):
222
+ """
223
+ Create an unambiguous representation of this rectangle.
224
+
225
+ Example:
226
+
227
+ .. code-block:: python
228
+
229
+ from pygorithm.geometry import (vector2, rect2)
230
+
231
+ unit_square = rect2.Rect2(1, 1, vector2.Vector2(3, 4))
232
+
233
+ # prints rect2(width=1, height=1, mincorner=vector2(x=3, y=4))
234
+ print(repr(unit_square))
235
+
236
+ :returns: unambiguous representation of this rectangle
237
+ :rtype: string
238
+ """
239
+ pass
240
+
241
+ def __str__ (self ):
242
+ """
243
+ Create a human readable representation of this rectangle
244
+
245
+ Example:
246
+
247
+ .. code-block:: python
248
+
249
+ from pygorithm.geometry import (vector2, rect2)
250
+
251
+ unit_square = rect2.Rect2(1, 1, vector2.Vector2(3, 4))
252
+ ugly_Rect = rect2.Rect2(0.7071234, 0.7079876, vector2.Vector2(0.56789123, 0.876543))
253
+
254
+ # prints rect(1x1 at <3, 4>)
255
+ print(str(unit_square))
256
+
257
+ # prints rect(0.707x0.708 at <0.568, 0.877>)
258
+ """
259
+ pass
0 commit comments