zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Collision.h
Go to the documentation of this file.
1 /* This file is part of the Zenipex Library (zenilib).
2  * Copyright (C) 2011 Mitchell Keith Bloch (bazald).
3  *
4  * zenilib is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * zenilib is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with zenilib. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
160 #ifndef ZENI_COLLISION_H
161 #define ZENI_COLLISION_H
162 
163 #include <Zeni/Coordinate.h>
164 #include <Zeni/Vector3f.h>
165 #include <Zeni/Matrix4f.h>
166 
167 #include <utility>
168 
169 namespace Zeni {
170  namespace Collision {
171 
172  class ZENI_DLL Sphere;
173  class ZENI_DLL Plane;
174  class ZENI_DLL Line;
175  class ZENI_DLL Ray;
176  class ZENI_DLL Line_Segment;
177  class ZENI_DLL Infinite_Cylinder;
178  class ZENI_DLL Capsule;
179  class ZENI_DLL Parallelepiped;
180 
181  class ZENI_DLL Sphere {
182  public:
183  Sphere() : center(0.0f, 0.0f, 0.0f), radius(0.0f) {}
184  Sphere(const Point3f &center_, const float &radius_);
185 
186  float shortest_distance(const Sphere &rhs) const;
187  float shortest_distance(const Point3f &rhs) const;
188  inline float shortest_distance(const Plane &rhs) const;
189  inline float shortest_distance(const Line &rhs) const;
190  inline float shortest_distance(const Ray &rhs) const;
191  inline float shortest_distance(const Line_Segment &rhs) const;
192  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
193  inline float shortest_distance(const Capsule &rhs) const;
194  inline float shortest_distance(const Parallelepiped &rhs) const;
195 
196  template <typename TYPE>
197  bool intersects(const TYPE &rhs) const;
198 
199  const Point3f & get_center() const {return center;}
200  const float & get_radius() const {return radius;}
201 
202  private:
203  Point3f center;
204  float radius;
205  };
206 
207  class ZENI_DLL Plane {
208  public:
209  Plane() : point(0.0f, 0.0f, 0.0f), normal(0.0f, 0.0f, 1.0f) {}
210  Plane(const Point3f &point_, const Vector3f &normal_);
211 
212  float shortest_distance(const Plane &rhs) const;
213  float shortest_distance(const Point3f &rhs) const;
214  float shortest_distance(const Sphere &rhs) const;
215  inline float shortest_distance(const Line &rhs) const;
216  inline float shortest_distance(const Ray &rhs) const;
217  inline float shortest_distance(const Line_Segment &rhs) const;
218  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
219  inline float shortest_distance(const Capsule &rhs) const;
220  inline float shortest_distance(const Parallelepiped &rhs) const;
221 
222  template <typename TYPE>
223  bool intersects(const TYPE &rhs) const;
224 
225  const Point3f & get_point() const {return point;}
226  const Vector3f & get_normal() const {return normal;}
227 
228  private:
229  Point3f point;
230  Vector3f normal;
231  };
232 
233  class ZENI_DLL Line_Segment {
234  public:
235  Line_Segment() : end_point_a(0.0f, 0.0f, 0.0f), end_point_b(0.0f, 0.0f, 0.0f) {}
236  Line_Segment(const Point3f &end_point_a_, const Point3f &end_point_b_);
237 
239  std::pair<float, float> nearest_point(const Line_Segment &rhs) const;
240  std::pair<float, float> nearest_point(const Point3f &rhs) const;
241  std::pair<float, float> nearest_point(const Sphere &rhs) const;
242  std::pair<float, float> nearest_point(const Plane &rhs) const;
243  std::pair<float, float> nearest_point(const Line &rhs) const;
244  std::pair<float, float> nearest_point(const Ray &rhs) const;
245  std::pair<float, float> nearest_point(const Parallelepiped &rhs) const;
246 
247  inline float shortest_distance(const Sphere &rhs) const;
248  inline float shortest_distance(const Point3f &rhs) const;
249  inline float shortest_distance(const Plane &rhs) const;
250  inline float shortest_distance(const Line &rhs) const;
251  inline float shortest_distance(const Ray &rhs) const;
252  inline float shortest_distance(const Line_Segment &rhs) const;
253  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
254  inline float shortest_distance(const Capsule &rhs) const;
255  inline float shortest_distance(const Parallelepiped &rhs) const;
256 
257  template <typename TYPE>
258  bool intersects(const TYPE &rhs) const;
259 
260  const Point3f & get_end_point_a() const {return end_point_a;}
261  const Point3f & get_end_point_b() const {return end_point_b;}
262  const Vector3f & get_direction() const {return direction;}
263  const float & get_direction2() const {return direction2;}
264  static bool has_lower_bound() {return true;}
265  static bool has_upper_bound() {return true;}
266 
267  private:
268  Point3f end_point_a;
269  Point3f end_point_b;
270 
271  Vector3f direction; // end_point_b - end_point_a
272  float direction2; // direction * direction
273  };
274 
275  class ZENI_DLL Ray {
276  public:
277  Ray() : end_point_a(0.0f, 0.0f, 0.0f), end_point_b(0.0f, 0.0f, 0.0f) {}
278  Ray(const Point3f &end_point_a_, const Point3f &end_point_b_);
279  Ray(const Point3f &end_point_a_, const Vector3f &direction_vector_);
280 
282  std::pair<float, float> nearest_point(const Ray &rhs) const;
283  std::pair<float, float> nearest_point(const Point3f &rhs) const;
284  std::pair<float, float> nearest_point(const Sphere &rhs) const;
285  std::pair<float, float> nearest_point(const Plane &rhs) const;
286  std::pair<float, float> nearest_point(const Line_Segment &rhs) const;
287  std::pair<float, float> nearest_point(const Line &rhs) const;
288  std::pair<float, float> nearest_point(const Parallelepiped &rhs) const;
289 
290  inline float shortest_distance(const Sphere &rhs) const;
291  inline float shortest_distance(const Point3f &rhs) const;
292  inline float shortest_distance(const Plane &rhs) const;
293  inline float shortest_distance(const Line &rhs) const;
294  inline float shortest_distance(const Ray &rhs) const;
295  inline float shortest_distance(const Line_Segment &rhs) const;
296  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
297  inline float shortest_distance(const Capsule &rhs) const;
298  inline float shortest_distance(const Parallelepiped &rhs) const;
299 
300  template <typename TYPE>
301  bool intersects(const TYPE &rhs) const;
302 
303  const Point3f & get_end_point_a() const {return end_point_a;}
304  const Point3f & get_end_point_b() const {return end_point_b;}
305  const Vector3f & get_direction() const {return direction;}
306  const float & get_direction2() const {return direction2;}
307  static bool has_lower_bound() {return true;}
308  static bool has_upper_bound() {return false;}
309 
310  private:
311  Point3f end_point_a;
312  Point3f end_point_b;
313 
314  Vector3f direction; // end_point_b - end_point_a
315  float direction2; // direction * direction
316  };
317 
318  class ZENI_DLL Line {
319  public:
320  Line() : end_point_a(0.0f, 0.0f, 0.0f), end_point_b(0.0f, 0.0f, 0.0f) {}
321  Line(const Point3f &end_point_a_, const Point3f &end_point_b_);
322  Line(const Point3f &end_point_a_, const Vector3f &direction_vector_);
323 
324  float shortest_distance(const Line &rhs) const;
325  float shortest_distance(const Point3f &rhs) const;
326  float shortest_distance(const Sphere &rhs) const;
327  float shortest_distance(const Line_Segment &rhs) const;
328  float shortest_distance(const Plane &rhs) const;
329  float shortest_distance(const Parallelepiped &rhs) const;
330  inline float shortest_distance(const Ray &rhs) const;
331  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
332  inline float shortest_distance(const Capsule &rhs) const;
333 
334  template <typename TYPE>
335  bool intersects(const TYPE &rhs) const;
336 
337  const Point3f & get_end_point_a() const {return end_point_a;}
338  const Point3f & get_end_point_b() const {return end_point_b;}
339  const Vector3f & get_direction() const {return direction;}
340  const float & get_direction2() const {return direction2;}
341  static bool has_lower_bound() {return false;}
342  static bool has_upper_bound() {return false;}
343 
344  private:
345  Point3f end_point_a;
346  Point3f end_point_b;
347 
348  Vector3f direction; // end_point_b - end_point_a
349  float direction2; // direction * direction
350  };
351 
352  class ZENI_DLL Infinite_Cylinder {
353  public:
354  Infinite_Cylinder() : radius(0) {}
355  Infinite_Cylinder(const Point3f &end_point_a_, const Point3f &end_point_b_,
356  const float &radius_);
357  Infinite_Cylinder(const Point3f &end_point_a_, const Vector3f &direction_vector_,
358  const float &radius_);
359 
360  float shortest_distance(const Infinite_Cylinder &rhs) const;
361  float shortest_distance(const Point3f &rhs) const;
362  float shortest_distance(const Sphere &rhs) const;
363  float shortest_distance(const Plane &rhs) const;
364  float shortest_distance(const Line &rhs) const;
365  float shortest_distance(const Ray &rhs) const;
366  float shortest_distance(const Line_Segment &rhs) const;
367  inline float shortest_distance(const Capsule &rhs) const;
368  inline float shortest_distance(const Parallelepiped &rhs) const;
369 
370  template <typename TYPE>
371  bool intersects(const TYPE &rhs) const;
372 
373  const Point3f & get_end_point_a() const {return line.get_end_point_a();}
374  const Point3f & get_end_point_b() const {return line.get_end_point_b();}
375  const float & get_radius() const {return radius;}
376 
377  private:
378  Line line;
379  float radius;
380  };
381 
382  class ZENI_DLL Capsule {
383  public:
384  Capsule() : radius(0) {}
385  Capsule(const Point3f &end_point_a_, const Point3f &end_point_b_,
386  const float &radius_);
387 
389  std::pair<float, float> nearest_point(const Capsule &rhs) const;
390  std::pair<float, float> nearest_point(const Point3f &rhs) const;
391  std::pair<float, float> nearest_point(const Sphere &rhs) const;
392  std::pair<float, float> nearest_point(const Plane &rhs) const;
393  std::pair<float, float> nearest_point(const Line &rhs) const;
394  std::pair<float, float> nearest_point(const Ray &rhs) const;
395  std::pair<float, float> nearest_point(const Line_Segment &rhs) const;
396  std::pair<float, float> nearest_point(const Infinite_Cylinder &rhs) const;
397  std::pair<float, float> nearest_point(const Parallelepiped &rhs) const;
398 
399  inline float shortest_distance(const Capsule &rhs) const;
400  inline float shortest_distance(const Point3f &rhs) const;
401  inline float shortest_distance(const Sphere &rhs) const;
402  inline float shortest_distance(const Plane &rhs) const;
403  inline float shortest_distance(const Line &rhs) const;
404  inline float shortest_distance(const Ray &rhs) const;
405  inline float shortest_distance(const Line_Segment &rhs) const;
406  inline float shortest_distance(const Infinite_Cylinder &rhs) const;
407  inline float shortest_distance(const Parallelepiped &rhs) const;
408 
409  template <typename TYPE>
410  bool intersects(const TYPE &rhs) const;
411 
412  const Point3f & get_end_point_a() const {return line_segment.get_end_point_a();}
413  const Point3f & get_end_point_b() const {return line_segment.get_end_point_b();}
414  const float & get_radius() const {return radius;}
415 
416  private:
417  Line_Segment line_segment;
418  float radius;
419  };
420 
421  class ZENI_DLL Parallelepiped {
422  public:
423  Parallelepiped() : point(0.0f, 0.0f, 0.0f), edge_a(1.0f, 0.0f, 0.0f), edge_b(0.0f, 1.0f, 0.0f), edge_c(0.0f, 0.0f, 1.0f) {}
424  Parallelepiped(const Point3f &point_, const Vector3f &edge_a_,
425  const Vector3f &edge_b_, const Vector3f &edge_c_);
426 
427  float shortest_distance(const Parallelepiped &rhs) const;
428  float shortest_distance(const Point3f &rhs) const;
429  float shortest_distance(const Sphere &rhs) const;
430  float shortest_distance(const Plane &rhs) const;
431  float shortest_distance(const Infinite_Cylinder &rhs) const;
432  inline float shortest_distance(const Line &rhs) const;
433  inline float shortest_distance(const Ray &rhs) const;
434  inline float shortest_distance(const Line_Segment &rhs) const;
435  inline float shortest_distance(const Capsule &rhs) const;
436 
437  template <typename TYPE>
438  bool intersects(const TYPE &rhs) const;
439 
440  const Point3f & get_point() const {return point;}
441  const Vector3f & get_edge_a() const {return edge_a;}
442  const Vector3f & get_edge_b() const {return edge_b;}
443  const Vector3f & get_edge_c() const {return edge_c;}
444  const Matrix4f & get_convert_from() const {return convert_from;}
445  const Matrix4f & get_convert_to() const {return convert_to;}
446  const Point3f & get_center() const {return center;}
447  const Vector3f & get_extents() const {return extents;}
448  const Vector3f & get_normal_a() const {return normal_a;}
449  const Vector3f & get_normal_b() const {return normal_b;}
450  const Vector3f & get_normal_c() const {return normal_c;}
451 
452  private:
453  float some_distance(const Parallelepiped &rhs) const;
454 
455  Point3f point;
456  Vector3f edge_a;
457  Vector3f edge_b;
458  Vector3f edge_c;
459 
460  Matrix4f convert_from;
461  Matrix4f convert_to;
462 
463  Point3f center;
464  Vector3f extents;
465  Vector3f normal_a;
466  Vector3f normal_b;
467  Vector3f normal_c;
468  };
469 
470  }
471 
472 }
473 
474 #endif
const Point3f & get_end_point_a() const
Definition: Collision.h:337
const Vector3f & get_direction() const
Definition: Collision.h:339
std::pair< float, float > nearest_point(const LINE_TYPE &lhs, const Point3f &rhs)
Definition: Collision.cpp:66
const Vector3f & get_normal_b() const
Definition: Collision.h:449
const Vector3f & get_normal_c() const
Definition: Collision.h:450
const Point3f & get_end_point_a() const
Definition: Collision.h:373
const Vector3f & get_direction() const
Definition: Collision.h:262
GLclampf f
Definition: glew.h:3390
Collision Capsule.
Definition: Collision.h:382
Collision Line.
Definition: Collision.h:318
const Point3f & get_end_point_a() const
Definition: Collision.h:260
const Vector3f & get_normal_a() const
Definition: Collision.h:448
const float & get_radius() const
Definition: Collision.h:200
const float & get_direction2() const
Definition: Collision.h:306
const float & get_direction2() const
Definition: Collision.h:263
const Point3f & get_end_point_b() const
Definition: Collision.h:261
const Vector3f & get_normal() const
Definition: Collision.h:226
const Point3f & get_end_point_a() const
Definition: Collision.h:303
Collision Line Segment.
Definition: Collision.h:233
const float & get_radius() const
Definition: Collision.h:375
Collision Infinite Cylinder.
Definition: Collision.h:352
const Point3f & get_center() const
Definition: Collision.h:446
A 3D Point represented with floats.
Definition: Coordinate.h:133
const Point3f & get_center() const
Definition: Collision.h:199
static bool has_lower_bound()
Definition: Collision.h:307
static bool has_lower_bound()
Definition: Collision.h:264
const Vector3f & get_edge_c() const
Definition: Collision.h:443
A Featureful 3-Space Vector Class.
Definition: Vector3f.h:58
const Vector3f & get_direction() const
Definition: Collision.h:305
const Matrix4f & get_convert_from() const
Definition: Collision.h:444
Collision Sphere.
Definition: Collision.h:181
const Vector3f & get_edge_a() const
Definition: Collision.h:441
const Vector3f & get_edge_b() const
Definition: Collision.h:442
const Point3f & get_end_point_b() const
Definition: Collision.h:374
Collision Parallelepiped.
Definition: Collision.h:421
const Point3f & get_end_point_b() const
Definition: Collision.h:304
Collision Ray.
Definition: Collision.h:275
const Point3f & get_point() const
Definition: Collision.h:225
const Matrix4f & get_convert_to() const
Definition: Collision.h:445
Collision Plane.
Definition: Collision.h:207
static bool has_upper_bound()
Definition: Collision.h:265
const Point3f & get_end_point_b() const
Definition: Collision.h:413
static bool has_upper_bound()
Definition: Collision.h:308
const Point3f & get_point() const
Definition: Collision.h:440
A Featureful 4-Space Matrix Class.
Definition: Matrix4f.h:47
const Point3f & get_end_point_a() const
Definition: Collision.h:412
const float & get_direction2() const
Definition: Collision.h:340
Definition: infutil.h:15
const Point3f & get_end_point_b() const
Definition: Collision.h:338
static bool has_upper_bound()
Definition: Collision.h:342
const float & get_radius() const
Definition: Collision.h:414
static bool has_lower_bound()
Definition: Collision.h:341
const Vector3f & get_extents() const
Definition: Collision.h:447