Class: Geospatial::Box
- Inherits:
-
Object
- Object
- Geospatial::Box
- Defined in:
- lib/geospatial/box.rb
Instance Attribute Summary collapse
-
#origin ⇒ Object
readonly
Returns the value of attribute origin.
-
#size ⇒ Object
readonly
Returns the value of attribute size.
Class Method Summary collapse
Instance Method Summary collapse
-
#corners {|@origin| ... } ⇒ Object
This yields the four corners of the box.
- #freeze ⇒ Object
- #include?(other) ⇒ Boolean
- #include_point?(point) ⇒ Boolean
-
#initialize(origin, size, max = nil) ⇒ Box
constructor
A new instance of Box.
- #intersect?(other) ⇒ Boolean
- #max ⇒ Object
-
#midpoints {|Vector[@origin[0] + size[0]| ... } ⇒ Object
This yields the midpoints of the four sides of the box.
- #min ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(origin, size, max = nil) ⇒ Box
Returns a new instance of Box.
52 53 54 55 56 |
# File 'lib/geospatial/box.rb', line 52 def initialize(origin, size, max = nil) @origin = origin @size = size @max = max end |
Instance Attribute Details
#origin ⇒ Object (readonly)
Returns the value of attribute origin.
64 65 66 |
# File 'lib/geospatial/box.rb', line 64 def origin @origin end |
#size ⇒ Object (readonly)
Returns the value of attribute size.
65 66 67 |
# File 'lib/geospatial/box.rb', line 65 def size @size end |
Class Method Details
.enclosing_points(points) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/geospatial/box.rb', line 32 def enclosing_points(points) return nil unless points.any? min = points.first.to_a max = points.first.to_a points.each do |point| point.each_with_index do |value, index| if value < min[index] min[index] = value elsif value > max[index] max[index] = value end end end return self.from_bounds(Vector.elements(min), Vector.elements(max)) end |
.from_bounds(min, max) ⇒ Object Also known as: []
26 27 28 |
# File 'lib/geospatial/box.rb', line 26 def from_bounds(min, max) self.new(min, max-min, max) end |
Instance Method Details
#corners {|@origin| ... } ⇒ Object
This yields the four corners of the box.
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/geospatial/box.rb', line 80 def corners return to_enum(:corners) unless block_given? yield(@origin) max = self.max yield(Vector[max[0], @origin[1]]) yield(max) yield(Vector[@origin[0], max[1]]) end |
#freeze ⇒ Object
58 59 60 61 62 |
# File 'lib/geospatial/box.rb', line 58 def freeze self.max super end |
#include?(other) ⇒ Boolean
111 112 113 |
# File 'lib/geospatial/box.rb', line 111 def include?(other) include_point?(other.min) && include_point?(other.max) end |
#include_point?(point) ⇒ Boolean
103 104 105 106 107 108 109 |
# File 'lib/geospatial/box.rb', line 103 def include_point?(point) 2.times do |i| return false if point[i] < min[i] or point[i] >= max[i] end return true end |
#intersect?(other) ⇒ Boolean
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/geospatial/box.rb', line 115 def intersect?(other) 2.times do |i| # Separating axis theorm, if the minimum of the other is past the maximum of self, or the maximum of other is less than the minimum of self, an intersection cannot occur. if other.min[i] > self.max[i] or other.max[i] < self.min[i] return false end end return true end |
#max ⇒ Object
75 76 77 |
# File 'lib/geospatial/box.rb', line 75 def max @max ||= @origin + @size end |
#midpoints {|Vector[@origin[0] + size[0]| ... } ⇒ Object
This yields the midpoints of the four sides of the box.
92 93 94 95 96 97 98 99 100 101 |
# File 'lib/geospatial/box.rb', line 92 def midpoints return to_enum(:midpoints) unless block_given? size = self.size yield(Vector[@origin[0] + size[0] / 2, @origin[1]]) yield(Vector[@origin[0] + size[0], @origin[1] + size[1] / 2]) yield(Vector[@origin[0] + size[0] / 2, @origin[1] + size[1]]) yield(Vector[@origin[0], @origin[1] + size[1] / 2]) end |
#min ⇒ Object
71 72 73 |
# File 'lib/geospatial/box.rb', line 71 def min @origin end |
#to_s ⇒ Object
67 68 69 |
# File 'lib/geospatial/box.rb', line 67 def to_s "#{self.class}[#{min.inspect}, #{max.inspect}]" end |