quadtree 1.0.6 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -3
- data/Rakefile +11 -2
- data/VERSION +1 -1
- data/lib/quadtree/quadtree.rb +57 -36
- data/quadtree.gemspec +10 -4
- metadata +32 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93b38a02013f5c97126e742d2262be25f388e4c1
|
4
|
+
data.tar.gz: 82bb915f6bddf1f6c1f187cbaf5a3a6eb3a47b0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f18c67ee620d739ddda87a0550f06eb770bb512a7781a0f1d534bdb3cbc51ee1d39fab47e96af94b2d7e75ad298d3b85bdc98ddb48d102efc53fe62be6233397
|
7
|
+
data.tar.gz: 3265235a06f9b067928906086849cca271a78eba0eec2efa48b6e4b6a1e065f006fa8d9274501724101c84e1ba0b69c7687eeac317312bd367f12bf4e7772381
|
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# Quadtree
|
2
2
|
|
3
|
-
|
4
|
-
![
|
3
|
+
![Build Status](https://codebuild.us-east-1.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoidk1aMm1Ya212SjRsU1pVdWNVZ2FRTDVPUXlVM2NsY0dWU2UxL1dEUlh2VTdxdURhcmxRK1JDTGg5OXJxeURKeFRiZXV5VEtTbmRBZCt6bTdDTms1Rm5ZPSIsIml2UGFyYW1ldGVyU3BlYyI6ImlUamttMGtUckZRT0tvM0EiLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D&branch=master)
|
4
|
+
[![Bitbucket Pipelines](https://img.shields.io/bitbucket/pipelines/janlindblom/ruby-quadtree.png)](https://bitbucket.org/janlindblom/ruby-quadtree)
|
5
|
+
[![Gem](https://img.shields.io/gem/v/quadtree.png)](https://rubygems.org/gems/quadtree)
|
6
|
+
[![Documentation](https://img.shields.io/badge/docs-rdoc.info-yellow.png)](http://www.rubydoc.info/gems/quadtree/frames)
|
5
7
|
|
6
8
|
Quadtrees in Ruby. For searching spatially related nodes in some space, you know.
|
7
9
|
|
@@ -50,7 +52,7 @@ qt.query_range(boundary2)
|
|
50
52
|
|
51
53
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
52
54
|
|
53
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number
|
55
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number using `rake version:create` or `rake version:bump`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
54
56
|
|
55
57
|
## Contributing
|
56
58
|
|
data/Rakefile
CHANGED
@@ -3,11 +3,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
require "rake/version_task"
|
5
5
|
require "bundler/gem_tasks"
|
6
|
-
#require "rubygems"
|
7
|
-
#require "rubygems/package_task"
|
8
6
|
require "rspec/core/rake_task"
|
9
7
|
require "yard"
|
10
8
|
require "yard/rake/yardoc_task"
|
9
|
+
require 'rubocop/rake_task'
|
11
10
|
require "quadtree"
|
12
11
|
|
13
12
|
RSpec::Core::RakeTask.new(:spec)
|
@@ -39,6 +38,8 @@ spec = Gem::Specification.new do |s|
|
|
39
38
|
s.add_development_dependency "rspec", "~> 3.0"
|
40
39
|
s.add_development_dependency "pry", "~> 0.11"
|
41
40
|
s.add_development_dependency "yard", "~> 0.9"
|
41
|
+
s.add_development_dependency "simplecov", "~> 0.16"
|
42
|
+
s.add_development_dependency "rubocop", "~> 0.54"
|
42
43
|
s.add_runtime_dependency "version", "~> 1.1"
|
43
44
|
end
|
44
45
|
|
@@ -52,4 +53,12 @@ YARD::Rake::YardocTask.new do |t|
|
|
52
53
|
t.stats_options = ['--list-undoc']
|
53
54
|
end
|
54
55
|
|
56
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
57
|
+
task.patterns = ['lib/**/*.rb']
|
58
|
+
# only show the files with failures
|
59
|
+
task.formatters = ['worst']
|
60
|
+
# don't abort rake on failure
|
61
|
+
task.fail_on_error = false
|
62
|
+
end
|
63
|
+
|
55
64
|
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.7
|
data/lib/quadtree/quadtree.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Quadtree
|
2
2
|
# A Quadtree.
|
3
3
|
class Quadtree
|
4
|
-
|
5
4
|
# Arbitrary constant to indicate how many elements can be stored in this
|
6
5
|
# quad tree node.
|
7
6
|
# @return [Integer] number of {Point}s this {Quadtree} can hold.
|
@@ -34,7 +33,7 @@ module Quadtree
|
|
34
33
|
# @return [Quadtree]
|
35
34
|
attr_accessor :south_east
|
36
35
|
|
37
|
-
# @param boundary [AxisAlignedBoundingBox] the boundary for this {Quadtree}
|
36
|
+
# @param boundary [AxisAlignedBoundingBox] the boundary for this {Quadtree}.
|
38
37
|
def initialize(boundary)
|
39
38
|
self.boundary = boundary
|
40
39
|
self.points = []
|
@@ -49,69 +48,92 @@ module Quadtree
|
|
49
48
|
# @param point [Point] the point to insert.
|
50
49
|
# @return [Boolean] +true+ on success, +false+ otherwise.
|
51
50
|
def insert!(point)
|
52
|
-
return false unless
|
51
|
+
return false unless boundary.contains_point?(point)
|
53
52
|
|
54
|
-
if
|
55
|
-
|
53
|
+
if points.size < NODE_CAPACITY
|
54
|
+
points << point
|
56
55
|
return true
|
57
56
|
end
|
58
57
|
|
59
|
-
subdivide! if
|
60
|
-
return true if
|
61
|
-
return true if
|
62
|
-
return true if
|
63
|
-
return true if
|
58
|
+
subdivide! if north_west.nil?
|
59
|
+
return true if north_west.insert!(point)
|
60
|
+
return true if north_east.insert!(point)
|
61
|
+
return true if south_west.insert!(point)
|
62
|
+
return true if south_east.insert!(point)
|
64
63
|
|
65
64
|
false
|
66
65
|
end
|
67
66
|
|
67
|
+
# Return the size of this instance, the number of {Point}s stored in this
|
68
|
+
# {Quadtree}.
|
69
|
+
# @return [Integer] the size of this instance.
|
70
|
+
def size
|
71
|
+
count = 0
|
72
|
+
count += points.size
|
73
|
+
unless north_west.nil?
|
74
|
+
count += north_west.size
|
75
|
+
count += north_east.size
|
76
|
+
count += south_west.size
|
77
|
+
count += south_east.size
|
78
|
+
end
|
79
|
+
count
|
80
|
+
end
|
81
|
+
|
68
82
|
# Finds all points contained within a range.
|
69
83
|
#
|
70
84
|
# @param range [AxisAlignedBoundingBox] the range to search within.
|
71
|
-
# @return [Array<Point>]
|
85
|
+
# @return [Array<Point>] all {Point}s in given range.
|
72
86
|
def query_range(range)
|
73
87
|
# Prepare an array of results
|
74
88
|
points_in_range = []
|
75
89
|
|
76
90
|
# Automatically abort if the range does not intersect this quad
|
77
|
-
return points_in_range unless
|
91
|
+
return points_in_range unless boundary.intersects?(range)
|
78
92
|
|
79
93
|
# Check objects at this quad level
|
80
|
-
|
94
|
+
points.each do |point|
|
81
95
|
points_in_range << point if range.contains_point?(point)
|
82
96
|
end
|
83
97
|
|
84
98
|
# Terminate here, if there are no children
|
85
|
-
return points_in_range if
|
99
|
+
return points_in_range if north_west.nil?
|
86
100
|
|
87
101
|
# Otherwise, add the points from the children
|
88
|
-
points_in_range +=
|
89
|
-
points_in_range +=
|
90
|
-
points_in_range +=
|
91
|
-
points_in_range +=
|
102
|
+
points_in_range += north_west.query_range(range)
|
103
|
+
points_in_range += north_east.query_range(range)
|
104
|
+
points_in_range += south_west.query_range(range)
|
105
|
+
points_in_range += south_east.query_range(range)
|
92
106
|
|
93
107
|
points_in_range
|
94
108
|
end
|
95
109
|
|
96
110
|
private
|
97
111
|
|
98
|
-
# @return [Boolean]
|
112
|
+
# @return [Boolean] +true+ on success, +false+ otherwise.
|
99
113
|
def subdivide!
|
100
|
-
left_edge =
|
101
|
-
right_edge =
|
102
|
-
top_edge =
|
103
|
-
bottom_edge =
|
104
|
-
quad_half_dimension =
|
105
|
-
|
106
|
-
north_west_center = Point.new
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
114
|
+
left_edge = boundary.left
|
115
|
+
right_edge = boundary.right
|
116
|
+
top_edge = boundary.top
|
117
|
+
bottom_edge = boundary.bottom
|
118
|
+
quad_half_dimension = boundary.half_dimension / 2
|
119
|
+
|
120
|
+
north_west_center = Point.new(left_edge + quad_half_dimension,
|
121
|
+
top_edge - quad_half_dimension)
|
122
|
+
north_east_center = Point.new(right_edge - quad_half_dimension,
|
123
|
+
top_edge - quad_half_dimension)
|
124
|
+
south_east_center = Point.new(left_edge + quad_half_dimension,
|
125
|
+
bottom_edge + quad_half_dimension)
|
126
|
+
south_west_center = Point.new(right_edge - quad_half_dimension,
|
127
|
+
bottom_edge + quad_half_dimension)
|
128
|
+
|
129
|
+
north_west_boundary = AxisAlignedBoundingBox.new(north_west_center,
|
130
|
+
quad_half_dimension)
|
131
|
+
north_east_boundary = AxisAlignedBoundingBox.new(north_east_center,
|
132
|
+
quad_half_dimension)
|
133
|
+
south_west_boundary = AxisAlignedBoundingBox.new(south_west_center,
|
134
|
+
quad_half_dimension)
|
135
|
+
south_east_boundary = AxisAlignedBoundingBox.new(south_east_center,
|
136
|
+
quad_half_dimension)
|
115
137
|
|
116
138
|
self.north_west = Quadtree.new north_west_boundary
|
117
139
|
self.north_east = Quadtree.new north_east_boundary
|
@@ -119,8 +141,7 @@ module Quadtree
|
|
119
141
|
self.south_east = Quadtree.new south_east_boundary
|
120
142
|
|
121
143
|
true
|
122
|
-
rescue
|
123
|
-
puts "Something went wrong: #{error}"
|
144
|
+
rescue StandardError
|
124
145
|
false
|
125
146
|
end
|
126
147
|
end
|
data/quadtree.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: quadtree 1.0.
|
2
|
+
# stub: quadtree 1.0.7 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "quadtree".freeze
|
6
|
-
s.version = "1.0.
|
6
|
+
s.version = "1.0.7"
|
7
7
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Jan Lindblom".freeze]
|
11
11
|
s.bindir = "exe".freeze
|
12
|
-
s.date = "2018-04-
|
12
|
+
s.date = "2018-04-04"
|
13
13
|
s.email = ["janlindblom@fastmail.fm".freeze]
|
14
14
|
s.files = [".editorconfig".freeze, ".gitignore".freeze, ".rspec".freeze, "CODE_OF_CONDUCT.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/quadtree.rb".freeze, "lib/quadtree/axis_aligned_bounding_box.rb".freeze, "lib/quadtree/point.rb".freeze, "lib/quadtree/quadtree.rb".freeze, "lib/quadtree/unknown_type_error.rb".freeze, "lib/quadtree/version.rb".freeze, "quadtree.gemspec".freeze]
|
15
15
|
s.homepage = "https://bitbucket.org/janlindblom/ruby-quadtree".freeze
|
@@ -27,6 +27,8 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"])
|
28
28
|
s.add_development_dependency(%q<pry>.freeze, ["~> 0.11"])
|
29
29
|
s.add_development_dependency(%q<yard>.freeze, ["~> 0.9"])
|
30
|
+
s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.16"])
|
31
|
+
s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.54"])
|
30
32
|
s.add_runtime_dependency(%q<version>.freeze, ["~> 1.1"])
|
31
33
|
else
|
32
34
|
s.add_dependency(%q<bundler>.freeze, ["~> 1.14"])
|
@@ -34,6 +36,8 @@ Gem::Specification.new do |s|
|
|
34
36
|
s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
|
35
37
|
s.add_dependency(%q<pry>.freeze, ["~> 0.11"])
|
36
38
|
s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
|
39
|
+
s.add_dependency(%q<simplecov>.freeze, ["~> 0.16"])
|
40
|
+
s.add_dependency(%q<rubocop>.freeze, ["~> 0.54"])
|
37
41
|
s.add_dependency(%q<version>.freeze, ["~> 1.1"])
|
38
42
|
end
|
39
43
|
else
|
@@ -42,6 +46,8 @@ Gem::Specification.new do |s|
|
|
42
46
|
s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
|
43
47
|
s.add_dependency(%q<pry>.freeze, ["~> 0.11"])
|
44
48
|
s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
|
49
|
+
s.add_dependency(%q<simplecov>.freeze, ["~> 0.16"])
|
50
|
+
s.add_dependency(%q<rubocop>.freeze, ["~> 0.54"])
|
45
51
|
s.add_dependency(%q<version>.freeze, ["~> 1.1"])
|
46
52
|
end
|
47
53
|
end
|
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.
|
4
|
+
version: 1.0.7
|
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-04-
|
11
|
+
date: 2018-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.9'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.16'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.16'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.54'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.54'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: version
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,9 +160,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
132
160
|
version: 2.3.0
|
133
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
162
|
requirements:
|
135
|
-
- - "
|
163
|
+
- - ">"
|
136
164
|
- !ruby/object:Gem::Version
|
137
|
-
version:
|
165
|
+
version: 1.3.1
|
138
166
|
requirements: []
|
139
167
|
rubyforge_project:
|
140
168
|
rubygems_version: 2.6.13
|