quadtree 1.0.6 → 1.0.7
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 +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
|
-

|
4
|
+
[](https://bitbucket.org/janlindblom/ruby-quadtree)
|
5
|
+
[](https://rubygems.org/gems/quadtree)
|
6
|
+
[](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
|