diff options
Diffstat (limited to 'libs/cocos2d/Support/CGPointExtension.h')
-rwxr-xr-x | libs/cocos2d/Support/CGPointExtension.h | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/libs/cocos2d/Support/CGPointExtension.h b/libs/cocos2d/Support/CGPointExtension.h new file mode 100755 index 0000000..96edeb7 --- /dev/null +++ b/libs/cocos2d/Support/CGPointExtension.h | |||
@@ -0,0 +1,334 @@ | |||
1 | /* cocos2d for iPhone | ||
2 | * http://www.cocos2d-iphone.org | ||
3 | * | ||
4 | * Copyright (c) 2007 Scott Lembcke | ||
5 | * | ||
6 | * Copyright (c) 2010 Lam Pham | ||
7 | * | ||
8 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
9 | * of this software and associated documentation files (the "Software"), to deal | ||
10 | * in the Software without restriction, including without limitation the rights | ||
11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
12 | * copies of the Software, and to permit persons to whom the Software is | ||
13 | * furnished to do so, subject to the following conditions: | ||
14 | * | ||
15 | * The above copyright notice and this permission notice shall be included in | ||
16 | * all copies or substantial portions of the Software. | ||
17 | * | ||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
24 | * SOFTWARE. | ||
25 | */ | ||
26 | |||
27 | /* | ||
28 | * Some of the functions were based on Chipmunk's cpVect.h. | ||
29 | */ | ||
30 | |||
31 | /** | ||
32 | @file | ||
33 | CGPoint extensions based on Chipmunk's cpVect file. | ||
34 | These extensions work both with CGPoint and cpVect. | ||
35 | |||
36 | The "ccp" prefix means: "CoCos2d Point" | ||
37 | |||
38 | Examples: | ||
39 | - ccpAdd( ccp(1,1), ccp(2,2) ); // preferred cocos2d way | ||
40 | - ccpAdd( CGPointMake(1,1), CGPointMake(2,2) ); // also ok but more verbose | ||
41 | |||
42 | - cpvadd( cpv(1,1), cpv(2,2) ); // way of the chipmunk | ||
43 | - ccpAdd( cpv(1,1), cpv(2,2) ); // mixing chipmunk and cocos2d (avoid) | ||
44 | - cpvadd( CGPointMake(1,1), CGPointMake(2,2) ); // mixing chipmunk and CG (avoid) | ||
45 | */ | ||
46 | |||
47 | #import <Availability.h> | ||
48 | |||
49 | #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED | ||
50 | #import <CoreGraphics/CGGeometry.h> | ||
51 | #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) | ||
52 | #import <Foundation/Foundation.h> | ||
53 | #endif | ||
54 | |||
55 | #import <math.h> | ||
56 | #import <objc/objc.h> | ||
57 | |||
58 | #ifdef __cplusplus | ||
59 | extern "C" { | ||
60 | #endif | ||
61 | |||
62 | /** Helper macro that creates a CGPoint | ||
63 | @return CGPoint | ||
64 | @since v0.7.2 | ||
65 | */ | ||
66 | #define ccp(__X__,__Y__) CGPointMake(__X__,__Y__) | ||
67 | |||
68 | |||
69 | /** Returns opposite of point. | ||
70 | @return CGPoint | ||
71 | @since v0.7.2 | ||
72 | */ | ||
73 | static inline CGPoint | ||
74 | ccpNeg(const CGPoint v) | ||
75 | { | ||
76 | return ccp(-v.x, -v.y); | ||
77 | } | ||
78 | |||
79 | /** Calculates sum of two points. | ||
80 | @return CGPoint | ||
81 | @since v0.7.2 | ||
82 | */ | ||
83 | static inline CGPoint | ||
84 | ccpAdd(const CGPoint v1, const CGPoint v2) | ||
85 | { | ||
86 | return ccp(v1.x + v2.x, v1.y + v2.y); | ||
87 | } | ||
88 | |||
89 | /** Calculates difference of two points. | ||
90 | @return CGPoint | ||
91 | @since v0.7.2 | ||
92 | */ | ||
93 | static inline CGPoint | ||
94 | ccpSub(const CGPoint v1, const CGPoint v2) | ||
95 | { | ||
96 | return ccp(v1.x - v2.x, v1.y - v2.y); | ||
97 | } | ||
98 | |||
99 | /** Returns point multiplied by given factor. | ||
100 | @return CGPoint | ||
101 | @since v0.7.2 | ||
102 | */ | ||
103 | static inline CGPoint | ||
104 | ccpMult(const CGPoint v, const CGFloat s) | ||
105 | { | ||
106 | return ccp(v.x*s, v.y*s); | ||
107 | } | ||
108 | |||
109 | /** Calculates midpoint between two points. | ||
110 | @return CGPoint | ||
111 | @since v0.7.2 | ||
112 | */ | ||
113 | static inline CGPoint | ||
114 | ccpMidpoint(const CGPoint v1, const CGPoint v2) | ||
115 | { | ||
116 | return ccpMult(ccpAdd(v1, v2), 0.5f); | ||
117 | } | ||
118 | |||
119 | /** Calculates dot product of two points. | ||
120 | @return CGFloat | ||
121 | @since v0.7.2 | ||
122 | */ | ||
123 | static inline CGFloat | ||
124 | ccpDot(const CGPoint v1, const CGPoint v2) | ||
125 | { | ||
126 | return v1.x*v2.x + v1.y*v2.y; | ||
127 | } | ||
128 | |||
129 | /** Calculates cross product of two points. | ||
130 | @return CGFloat | ||
131 | @since v0.7.2 | ||
132 | */ | ||
133 | static inline CGFloat | ||
134 | ccpCross(const CGPoint v1, const CGPoint v2) | ||
135 | { | ||
136 | return v1.x*v2.y - v1.y*v2.x; | ||
137 | } | ||
138 | |||
139 | /** Calculates perpendicular of v, rotated 90 degrees counter-clockwise -- cross(v, perp(v)) >= 0 | ||
140 | @return CGPoint | ||
141 | @since v0.7.2 | ||
142 | */ | ||
143 | static inline CGPoint | ||
144 | ccpPerp(const CGPoint v) | ||
145 | { | ||
146 | return ccp(-v.y, v.x); | ||
147 | } | ||
148 | |||
149 | /** Calculates perpendicular of v, rotated 90 degrees clockwise -- cross(v, rperp(v)) <= 0 | ||
150 | @return CGPoint | ||
151 | @since v0.7.2 | ||
152 | */ | ||
153 | static inline CGPoint | ||
154 | ccpRPerp(const CGPoint v) | ||
155 | { | ||
156 | return ccp(v.y, -v.x); | ||
157 | } | ||
158 | |||
159 | /** Calculates the projection of v1 over v2. | ||
160 | @return CGPoint | ||
161 | @since v0.7.2 | ||
162 | */ | ||
163 | static inline CGPoint | ||
164 | ccpProject(const CGPoint v1, const CGPoint v2) | ||
165 | { | ||
166 | return ccpMult(v2, ccpDot(v1, v2)/ccpDot(v2, v2)); | ||
167 | } | ||
168 | |||
169 | /** Rotates two points. | ||
170 | @return CGPoint | ||
171 | @since v0.7.2 | ||
172 | */ | ||
173 | static inline CGPoint | ||
174 | ccpRotate(const CGPoint v1, const CGPoint v2) | ||
175 | { | ||
176 | return ccp(v1.x*v2.x - v1.y*v2.y, v1.x*v2.y + v1.y*v2.x); | ||
177 | } | ||
178 | |||
179 | /** Unrotates two points. | ||
180 | @return CGPoint | ||
181 | @since v0.7.2 | ||
182 | */ | ||
183 | static inline CGPoint | ||
184 | ccpUnrotate(const CGPoint v1, const CGPoint v2) | ||
185 | { | ||
186 | return ccp(v1.x*v2.x + v1.y*v2.y, v1.y*v2.x - v1.x*v2.y); | ||
187 | } | ||
188 | |||
189 | /** Calculates the square length of a CGPoint (not calling sqrt() ) | ||
190 | @return CGFloat | ||
191 | @since v0.7.2 | ||
192 | */ | ||
193 | static inline CGFloat | ||
194 | ccpLengthSQ(const CGPoint v) | ||
195 | { | ||
196 | return ccpDot(v, v); | ||
197 | } | ||
198 | |||
199 | /** Calculates distance between point an origin | ||
200 | @return CGFloat | ||
201 | @since v0.7.2 | ||
202 | */ | ||
203 | CGFloat ccpLength(const CGPoint v); | ||
204 | |||
205 | /** Calculates the distance between two points | ||
206 | @return CGFloat | ||
207 | @since v0.7.2 | ||
208 | */ | ||
209 | CGFloat ccpDistance(const CGPoint v1, const CGPoint v2); | ||
210 | |||
211 | /** Returns point multiplied to a length of 1. | ||
212 | @return CGPoint | ||
213 | @since v0.7.2 | ||
214 | */ | ||
215 | CGPoint ccpNormalize(const CGPoint v); | ||
216 | |||
217 | /** Converts radians to a normalized vector. | ||
218 | @return CGPoint | ||
219 | @since v0.7.2 | ||
220 | */ | ||
221 | CGPoint ccpForAngle(const CGFloat a); | ||
222 | |||
223 | /** Converts a vector to radians. | ||
224 | @return CGFloat | ||
225 | @since v0.7.2 | ||
226 | */ | ||
227 | CGFloat ccpToAngle(const CGPoint v); | ||
228 | |||
229 | |||
230 | /** Clamp a value between from and to. | ||
231 | @since v0.99.1 | ||
232 | */ | ||
233 | float clampf(float value, float min_inclusive, float max_inclusive); | ||
234 | |||
235 | /** Clamp a point between from and to. | ||
236 | @since v0.99.1 | ||
237 | */ | ||
238 | CGPoint ccpClamp(CGPoint p, CGPoint from, CGPoint to); | ||
239 | |||
240 | /** Quickly convert CGSize to a CGPoint | ||
241 | @since v0.99.1 | ||
242 | */ | ||
243 | CGPoint ccpFromSize(CGSize s); | ||
244 | |||
245 | /** Run a math operation function on each point component | ||
246 | * absf, fllorf, ceilf, roundf | ||
247 | * any function that has the signature: float func(float); | ||
248 | * For example: let's try to take the floor of x,y | ||
249 | * ccpCompOp(p,floorf); | ||
250 | @since v0.99.1 | ||
251 | */ | ||
252 | CGPoint ccpCompOp(CGPoint p, float (*opFunc)(float)); | ||
253 | |||
254 | /** Linear Interpolation between two points a and b | ||
255 | @returns | ||
256 | alpha == 0 ? a | ||
257 | alpha == 1 ? b | ||
258 | otherwise a value between a..b | ||
259 | @since v0.99.1 | ||
260 | */ | ||
261 | CGPoint ccpLerp(CGPoint a, CGPoint b, float alpha); | ||
262 | |||
263 | |||
264 | /** @returns if points have fuzzy equality which means equal with some degree of variance. | ||
265 | @since v0.99.1 | ||
266 | */ | ||
267 | BOOL ccpFuzzyEqual(CGPoint a, CGPoint b, float variance); | ||
268 | |||
269 | |||
270 | /** Multiplies a nd b components, a.x*b.x, a.y*b.y | ||
271 | @returns a component-wise multiplication | ||
272 | @since v0.99.1 | ||
273 | */ | ||
274 | CGPoint ccpCompMult(CGPoint a, CGPoint b); | ||
275 | |||
276 | /** @returns the signed angle in radians between two vector directions | ||
277 | @since v0.99.1 | ||
278 | */ | ||
279 | float ccpAngleSigned(CGPoint a, CGPoint b); | ||
280 | |||
281 | /** @returns the angle in radians between two vector directions | ||
282 | @since v0.99.1 | ||
283 | */ | ||
284 | float ccpAngle(CGPoint a, CGPoint b); | ||
285 | |||
286 | /** Rotates a point counter clockwise by the angle around a pivot | ||
287 | @param v is the point to rotate | ||
288 | @param pivot is the pivot, naturally | ||
289 | @param angle is the angle of rotation cw in radians | ||
290 | @returns the rotated point | ||
291 | @since v0.99.1 | ||
292 | */ | ||
293 | CGPoint ccpRotateByAngle(CGPoint v, CGPoint pivot, float angle); | ||
294 | |||
295 | /** A general line-line intersection test | ||
296 | @param p1 | ||
297 | is the startpoint for the first line P1 = (p1 - p2) | ||
298 | @param p2 | ||
299 | is the endpoint for the first line P1 = (p1 - p2) | ||
300 | @param p3 | ||
301 | is the startpoint for the second line P2 = (p3 - p4) | ||
302 | @param p4 | ||
303 | is the endpoint for the second line P2 = (p3 - p4) | ||
304 | @param s | ||
305 | is the range for a hitpoint in P1 (pa = p1 + s*(p2 - p1)) | ||
306 | @param t | ||
307 | is the range for a hitpoint in P3 (pa = p2 + t*(p4 - p3)) | ||
308 | @return bool | ||
309 | indicating successful intersection of a line | ||
310 | note that to truly test intersection for segments we have to make | ||
311 | sure that s & t lie within [0..1] and for rays, make sure s & t > 0 | ||
312 | the hit point is p3 + t * (p4 - p3); | ||
313 | the hit point also is p1 + s * (p2 - p1); | ||
314 | @since v0.99.1 | ||
315 | */ | ||
316 | BOOL ccpLineIntersect(CGPoint p1, CGPoint p2, | ||
317 | CGPoint p3, CGPoint p4, | ||
318 | float *s, float *t); | ||
319 | |||
320 | /* | ||
321 | ccpSegmentIntersect returns YES if Segment A-B intersects with segment C-D | ||
322 | @since v1.0.0 | ||
323 | */ | ||
324 | BOOL ccpSegmentIntersect(CGPoint A, CGPoint B, CGPoint C, CGPoint D); | ||
325 | |||
326 | /* | ||
327 | ccpIntersectPoint returns the intersection point of line A-B, C-D | ||
328 | @since v1.0.0 | ||
329 | */ | ||
330 | CGPoint ccpIntersectPoint(CGPoint A, CGPoint B, CGPoint C, CGPoint D); | ||
331 | |||
332 | #ifdef __cplusplus | ||
333 | } | ||
334 | #endif | ||