quadtree 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5db2d5026956693fb12005b6f413baec2df1c55336d54612c69c2d2ea5daee7
4
- data.tar.gz: 64fad915c832732dce1b3d8f5d4e09153d6c2a5d0eacbe341ae9e36432ae910f
3
+ metadata.gz: e77411d8a1691d1187b9fe70bd783838b2b29c9f462445c7c00535a97f1f1647
4
+ data.tar.gz: 46b84bb36f80750c9f20688532860e54bf573ba1d2f72a5687d093a8f17384bc
5
5
  SHA512:
6
- metadata.gz: ba095f44c64f53fe6c708a55e59b2da9e43f4317c309fb8677ca24d0e9538c6104eec212c3ce05e092b17816a0b226e2a114ee86b16b5ce92cfc1a8dd582a681
7
- data.tar.gz: 3d2ea5d459b276877dae1e42300f5b457c88b557cd88dc3240c4f6864cb430c0044c5ee27ceac0d0d6b1b2a1ee573f627548d12373a66eb4760f0b9c09f91712
6
+ metadata.gz: 6411caa3b61a5b9c3f2e5ca06c15301334957d3ccfb42fb7d7b0eabc22f1edf1e0e4f60a108265ee647af9084c6645c87e0b89c11cd8194964f8aed2857eebf0
7
+ data.tar.gz: 2eba1b1e00508e045030ebda1dc2d49f691fa73c674e4f736f8d0d69e0189cfd1eee079797822c6c2d3c3913a29bb5c0f34d76194de21c26f591660e3064ec68
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Quadtree
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/quadtree.svg)](https://badge.fury.io/rb/quadtree)
4
+
3
5
  Quadtrees in Ruby. For searching spatially related nodes in some space, you know.
4
6
 
5
7
  ## Installation
@@ -1,5 +1,3 @@
1
- # This is a sample build configuration for Ruby.
2
- # Check our guides at https://confluence.atlassian.com/x/8r-5Mw for more examples.
3
1
  image: ruby:2.4.0
4
2
 
5
3
  pipelines:
@@ -9,8 +7,10 @@ pipelines:
9
7
  caches:
10
8
  - bundler
11
9
  script:
12
- - bundle install
10
+ - bundle install --path ./vendor
11
+ - bundle exec rake build
13
12
  - bundle exec rake spec
13
+ - bundle exec rake yard
14
14
 
15
15
  definitions:
16
16
  caches:
@@ -2,72 +2,98 @@ module Quadtree
2
2
  # Axis-aligned bounding box with half dimension and center.
3
3
  class AxisAlignedBoundingBox
4
4
 
5
- # @return [Point]
5
+ # Center {Point} of this instance.
6
+ #
7
+ # @return [Point] the {Point} marking the center of this instance.
6
8
  attr_accessor :center
7
- # @return [Float]
9
+
10
+ # Half dimension of this instance (distance from the center {Point} to the
11
+ # edge).
12
+ #
13
+ # @return [Float] distance from the center {Point} to the edge.
8
14
  attr_accessor :half_dimension
9
15
 
10
- # @param [Point] center
11
- # @param [Float] half_dimension
16
+ # @param center [Point]
17
+ # @param half_dimension [Float]
12
18
  def initialize(center, half_dimension)
13
19
  @center = center
14
20
  @half_dimension = half_dimension.to_f
15
21
  end
16
22
 
17
- # @param [Point] point
18
- # @return [Boolean]
23
+ # Check if this instance contains a given {Point}.
24
+ #
25
+ # @param point [Point] the {Point} to check for.
26
+ # @return [Boolean] +true+ if given {Point} is contained, +false+
27
+ # otherwise.
19
28
  def contains_point?(point)
20
- if point.x >= self.center.x - self.half_dimension and point.x <= self.center.x + self.half_dimension
21
- if point.y >= self.center.y - self.half_dimension and point.y <= self.center.y + self.half_dimension
29
+ if point.x >= self.center.x - self.half_dimension &&
30
+ point.x <= self.center.x + self.half_dimension
31
+ if point.y >= self.center.y - self.half_dimension &&
32
+ point.y <= self.center.y + self.half_dimension
22
33
  return true
23
34
  end
24
35
  end
25
36
  false
26
37
  end
27
38
 
28
- # @param [AxisAlignedBoundingBox] other
29
- # @return [Boolean]
39
+ # Check if this instance intersects with another instance.
40
+ #
41
+ # @param other [AxisAlignedBoundingBox] the other instance to check for.
42
+ # @return [Boolean] +true+ if these intersects, +false+ otherwise.
30
43
  def intersects?(other)
31
44
  other_lt_corner = Point.new(other.left, other.top)
32
45
  other_rt_corner = Point.new(other.right, other.top)
33
46
  other_lb_corner = Point.new(other.left, other.bottom)
34
47
  other_rb_corner = Point.new(other.right, other.bottom)
35
48
 
36
- [other_lt_corner, other_rt_corner, other_lb_corner, other_rb_corner].each do |corner|
49
+ [
50
+ other_lt_corner,
51
+ other_rt_corner,
52
+ other_lb_corner,
53
+ other_rb_corner
54
+ ].each do |corner|
37
55
  return true if self.contains_point?(corner)
38
56
  end
39
57
  false
40
58
  end
41
59
 
42
- # @return [Float]
60
+ # Get the X coordinate of the left edge of this instance.
61
+ #
62
+ # @return [Float] the X coordinate of the left edge of this instance.
43
63
  def left
44
64
  @center.x - @half_dimension
45
65
  end
46
66
 
47
- # @return [Float]
67
+ # Get the X coordinate of the right edge of this instance.
68
+ #
69
+ # @return [Float] the X coordinate of the right edge of this instance.
48
70
  def right
49
71
  @center.x + @half_dimension
50
72
  end
51
73
 
52
- # Get the Y coordinate of the top edge of this AABB.
74
+ # Get the Y coordinate of the top edge of this instance.
53
75
  #
54
- # @return [Float] the Y coordinate of the top edge of this AABB.
76
+ # @return [Float] the Y coordinate of the top edge of this instance.
55
77
  def top
56
78
  @center.y + @half_dimension
57
79
  end
58
80
 
59
- # Get the Y coordinate of the bottom edge of this AABB.
81
+ # Get the Y coordinate of the bottom edge of this instance.
60
82
  #
61
- # @return [Float] the Y coordinate of the bottom edge of this AABB.
83
+ # @return [Float] the Y coordinate of the bottom edge of this instance.
62
84
  def bottom
63
85
  @center.y - @half_dimension
64
86
  end
65
87
 
88
+ # Get the width of this instance.
89
+ #
66
90
  # @return [Float]
67
91
  def width
68
92
  span
69
93
  end
70
94
 
95
+ # Get the height of this instance.
96
+ #
71
97
  # @return [Float]
72
98
  def height
73
99
  span
@@ -2,48 +2,52 @@ module Quadtree
2
2
  # Simple coordinate object to represent points in some space.
3
3
  class Point
4
4
 
5
- # @return [Float] X coordinate
5
+ # The X coordinate of this instance.
6
+ # @return [Float] X coordinate.
6
7
  attr_accessor :x
7
8
 
8
- # @return [Float] Y coordinate
9
+ # The Y coordinate of this instance.
10
+ # @return [Float] Y coordinate.
9
11
  attr_accessor :y
10
12
 
11
- # @return [Object] Payload attached to this {Point}.
13
+ # Optional payload attached to this instance.
14
+ # @return [Object] payload attached to this instance.
12
15
  attr_accessor :data
13
16
 
14
- # Create a new {Point}.
15
- #
16
- # @param [Float, Numeric] x X coordinate.
17
- # @param [Float, Numeric] y Y coordinate.
18
- # @param [Object] data {Point} payload (optional).
17
+ # @param x [Float, Numeric] X coordinate.
18
+ # @param y [Float, Numeric] Y coordinate.
19
+ # @param data [Object] payload payload attached to this instance
20
+ # (optional).
19
21
  def initialize(x, y, data=nil)
20
22
  @x = x.to_f
21
23
  @y = y.to_f
22
24
  @data = data unless data.nil?
23
25
  end
24
26
 
25
- # This will calculate distance to another, given that they are both
26
- # on the same flat two dimensional plane.
27
+ # This will calculate distance to another {Point}, given that they are
28
+ # both in the same 2D space.
27
29
  #
28
- # @param [Point] other the other {Point}.
30
+ # @param other [Point] the other {Point}.
29
31
  # @return [Float] the distance to the other {Point}.
30
32
  def distance_to(other)
31
33
  Math.sqrt((other.x - self.x) ** 2 + (other.y - self.y) ** 2)
32
34
  end
33
35
 
34
- # This will calculate distance to another point using the Haversine
35
- # formula. This means that it will treat #x as longitude and #y as
36
+ # This will calculate distance to another {Point} using the Haversine
37
+ # formula. This means that it will treat {#x} as longitude and {#y} as
36
38
  # latitude!
37
39
  #
38
40
  # a = sin²(Δφ/2) + cos φ_1 ⋅ cos φ_2 ⋅ sin²(Δλ/2)
41
+ #
39
42
  # c = 2 ⋅ atan2( √a, √(1−a) )
43
+ #
40
44
  # d = R ⋅ c
41
45
  #
42
46
  # where φ is latitude, λ is longitude, R is earth’s radius (mean
43
47
  # radius = 6 371 km);
44
48
  # note that angles need to be in radians to pass to trig functions!
45
49
  #
46
- # @param [Point] other the other {Point}.
50
+ # @param other [Point] the other {Point}.
47
51
  # @return [Float] the distance, in meters, to the other {Point}.
48
52
  def haversine_distance_to(other)
49
53
  # earth's radius
@@ -1,10 +1,10 @@
1
1
  module Quadtree
2
- # A Quadtree
2
+ # A Quadtree.
3
3
  class Quadtree
4
4
 
5
5
  # Arbitrary constant to indicate how many elements can be stored in this
6
6
  # quad tree node.
7
- # @return [Integer]
7
+ # @return [Integer] number of {Point}s this {Quadtree} can hold.
8
8
  NODE_CAPACITY = 4
9
9
 
10
10
  # Axis-aligned bounding box stored as a center with half-dimensions to
@@ -18,15 +18,23 @@ module Quadtree
18
18
 
19
19
  # Children
20
20
 
21
+ # North west corner of this quad.
21
22
  # @return [Quadtree]
22
23
  attr_accessor :north_west
24
+
25
+ # North east corner of this quad.
23
26
  # @return [Quadtree]
24
27
  attr_accessor :north_east
28
+
29
+ # South west corner of this quad.
25
30
  # @return [Quadtree]
26
31
  attr_accessor :south_west
32
+
33
+ # South east corner of this quad.
27
34
  # @return [Quadtree]
28
35
  attr_accessor :south_east
29
36
 
37
+ # @param boundary [AxisAlignedBoundingBox] the boundary for this {Quadtree}
30
38
  def initialize(boundary)
31
39
  self.boundary = boundary
32
40
  self.points = []
@@ -36,8 +44,10 @@ module Quadtree
36
44
  self.south_east = nil
37
45
  end
38
46
 
39
- # @param [Point] point
40
- # @return [Boolean]
47
+ # Insert a {Point} in this {Quadtree}.
48
+ #
49
+ # @param point [Point] the point to insert.
50
+ # @return [Boolean] +true+ on success, +false+ otherwise.
41
51
  def insert!(point)
42
52
  return false unless self.boundary.contains_point?(point)
43
53
 
@@ -57,7 +67,7 @@ module Quadtree
57
67
 
58
68
  # Finds all points contained within a range.
59
69
  #
60
- # @param [AxisAlignedBoundingBox] range the range to search within.
70
+ # @param range [AxisAlignedBoundingBox] the range to search within.
61
71
  # @return [Array<Point>]
62
72
  def query_range(range)
63
73
  # Prepare an array of results
@@ -1,3 +1,4 @@
1
1
  module Quadtree
2
- VERSION = "1.0.3"
2
+ # Current version
3
+ VERSION = "1.0.4"
3
4
  end
data/lib/quadtree.rb CHANGED
@@ -6,7 +6,6 @@ require "quadtree/quadtree"
6
6
 
7
7
  # Quadtrees.
8
8
  #
9
- # @since 1.0.0
10
9
  # @author Jan Lindblom <janlindblom@fastmail.fm>
11
10
  module Quadtree
12
11
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quadtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Lindblom
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-26 00:00:00.000000000 Z
11
+ date: 2018-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler