Packages

A library for creating, manipulating, and detecting and resolving collisions between polygons.

Current section

4 Versions

Jump to

Compare versions

11 files changed
+354 additions
-210 deletions
  @@ -7,11 +7,13 @@ Implements the [separating axis theorem](https://en.wikipedia.org/wiki/Hyperplan
7 7
8 8 Using regular polygons with an arbitrary number of sides and of an artbitrary size, can detect collisions and calculate the minimum translation vector to resolve collision.
9 9
10 + [Documentation](https://hexdocs.pm/collision/)
11 +
10 12 ### Under development.
11 13 **TODO:**
12 14
13 15 + Additional collision detection methods.
14 - + 3D collition detection
16 + + 3D collision detection
15 17
16 18
17 19 ## Installation
  @@ -3,15 +3,18 @@
3 3 {<<"description">>,<<"Polygon collision detection and vector operations.">>}.
4 4 {<<"elixir">>,<<"~> 1.3">>}.
5 5 {<<"files">>,
6 - [<<"lib/collision.ex">>,<<"lib/collision/polygon/helper.ex">>,
6 + [<<"lib/collidable.ex">>,<<"lib/collision.ex">>,
7 + <<"lib/collision/polygon/helper.ex">>,
7 8 <<"lib/collision/polygon/regular_polygon.ex">>,
8 9 <<"lib/collision/polygon/vertex.ex">>,
9 10 <<"lib/collision/separating_axis.ex">>,<<"lib/collision/vector.ex">>,
10 11 <<"lib/collision/vector/vector2.ex">>,<<"lib/collision/vector/vector3.ex">>,
11 12 <<"mix.exs">>,<<"README.md">>,<<"LICENSE.md">>]}.
12 13 {<<"licenses">>,[<<"BSD2">>]}.
13 - {<<"links">>,[{<<"Github">>,<<"https://github.com/tpoulsen/collision">>}]}.
14 + {<<"links">>,
15 + [{<<"Docs">>,<<"https://hexdocs.pm/collision/">>},
16 + {<<"Github">>,<<"https://github.com/tpoulsen/collision">>}]}.
14 17 {<<"maintainers">>,[<<"Travis Poulsen">>]}.
15 18 {<<"name">>,<<"collision">>}.
16 19 {<<"requirements">>,[]}.
17 - {<<"version">>,<<"0.1.0">>}.
20 + {<<"version">>,<<"0.2.0">>}.
  @@ -0,0 +1,74 @@
1 + defprotocol Collidable do
2 + @moduledoc """
3 +
4 + """
5 +
6 + @doc """
7 + Determine whether a pair of collidable entities are in collision.
8 +
9 + ## Examples
10 +
11 + iex> Collidable.collision?(
12 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
13 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
14 + ...> )
15 + false
16 +
17 + iex> Collidable.SeparatingAxis.collision?(
18 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
19 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
20 + ...> midpoint: %{x: 4, y: 2}}
21 + ...> )
22 + true
23 +
24 + """
25 + def collision?(any, any)
26 +
27 + @doc """
28 + Determine how to resolve the collision.
29 +
30 + Returns: {Vector, magnitude}
31 +
32 + ## Examples
33 +
34 + iex> Collidable.resolution(
35 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
36 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
37 + ...> )
38 + nil
39 +
40 + iex> Collidable.resolution(
41 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
42 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
43 + ...> midpoint: %{x: 4, y: 1}}
44 + ...> )
45 + {%Collision.Vector.Vector2{x: 0.7071067811865475, y: 0.7071067811865475}, 0.7071067811865475}
46 +
47 + """
48 + def resolution(any, any)
49 +
50 + @doc """
51 + Resolve the collision.
52 +
53 + Returns the the first entity and the translation of the second entity.
54 +
55 + Returns: {Collidable_entity, Collidable_entity}
56 +
57 + ## Examples
58 +
59 + iex> Collidable.resolve_collision(
60 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
61 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
62 + ...> )
63 + nil
64 +
65 + iex> Collidable.resolve_collision(
66 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
67 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
68 + ...> midpoint: %{x: 4, y: 1}}
69 + ...> )
70 + {%Collision.Vector.Vector2{x: 0.7071067811865475, y: 0.7071067811865475}, 0.7071067811865475}
71 +
72 + """
73 + def resolve_collision(any, any)
74 + end
  @@ -12,9 +12,11 @@ defmodule Collision do
12 12 Returns: %RegularPolygon{}
13 13
14 14 ## Examples
15 - iex> Collision.two_dimensional_polygon(4, 2, 0, {0, 0})
16 - %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2,
17 - rotation_angle: 0.0, midpoint: %Collision.Polygon.Vertex{x: 0, y: 0}}
15 +
16 + iex> Collision.two_dimensional_polygon(4, 2, 0, {0, 0})
17 + %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2,
18 + rotation_angle: 0.0, midpoint: %Collision.Polygon.Vertex{x: 0, y: 0}}
19 +
18 20 """
19 21 @spec two_dimensional_polygon(integer, integer, number, {number, number}) :: RegularPolygon.t
20 22 def two_dimensional_polygon(sides, radius, rotation_angle, {x, y}) do
  @@ -28,18 +30,20 @@ defmodule Collision do
28 30 Returns: boolean
29 31
30 32 ## Examples
31 - iex> Collision.two_dimensional_collision?(
32 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
33 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
34 - ...> )
35 - false
36 33
37 - iex> Collision.two_dimensional_collision?(
38 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
39 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
40 - ...> midpoint: %{x: 4, y: 2}}
41 - ...> )
42 - true
34 + iex> Collision.two_dimensional_collision?(
35 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
36 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
37 + ...> )
38 + false
39 +
40 + iex> Collision.two_dimensional_collision?(
41 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
42 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
43 + ...> midpoint: %{x: 4, y: 2}}
44 + ...> )
45 + true
46 +
43 47 """
44 48 @spec two_dimensional_collision?(RegularPolygon.t, RegularPolygon.t) :: boolean
45 49 def two_dimensional_collision?(polygon1, polygon2) do
  @@ -53,21 +57,23 @@ defmodule Collision do
53 57 Returns: nil | {%Vector2{}, float}
54 58
55 59 ## Examples
56 - iex> Collision.SeparatingAxis.collision_mtv(
57 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
58 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
59 - ...> )
60 - nil
61 60
62 - iex> Collision.SeparatingAxis.collision_mtv(
63 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
64 - ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
65 - ...> midpoint: %{x: 4, y: 1}}
66 - ...> )
67 - {%Collision.Vector.Vector2{x: 2.0, y: 2.0}, 2.0}
61 + iex> Collision.SeparatingAxis.collision_mtv(
62 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
63 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2, midpoint: %{x: 4, y: 4}}
64 + ...> )
65 + nil
66 +
67 + iex> Collision.SeparatingAxis.collision_mtv(
68 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 2},
69 + ...> %Collision.Polygon.RegularPolygon{n_sides: 4, radius: 4,
70 + ...> midpoint: %{x: 4, y: 1}}
71 + ...> )
72 + {%Collision.Vector.Vector2{x: 2.0, y: 2.0}, 2.0}
73 +
68 74 """
69 75 @spec two_dimensional_mtv(RegularPolygon.t, RegularPolygon.t) :: boolean
70 76 def two_dimensional_mtv(polygon1, polygon2) do
71 - SeparatingAxis.collision?(polygon1, polygon2)
77 + SeparatingAxis.collision_mtv(polygon1, polygon2)
72 78 end
73 79 end
  @@ -11,8 +11,10 @@ defmodule Collision.Polygon.Helper do
11 11 angles in radians.
12 12
13 13 ## Examples
14 - iex> Collision.Polygon.Helper.degrees_to_radians(180)
15 - :math.pi
14 +
15 + iex> Collision.Polygon.Helper.degrees_to_radians(180)
16 + :math.pi
17 +
16 18 """
17 19 @spec degrees_to_radians(degrees) :: radians
18 20 def degrees_to_radians(degrees) do
Loading more files…