Current section
4 Versions
Jump to
Current section
4 Versions
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…