Class: CTioga2::Graphics::Types::SimpleRange
- Inherits:
-
Object
- Object
- CTioga2::Graphics::Types::SimpleRange
- Defined in:
- lib/ctioga2/graphics/types/boundaries.rb
Overview
A range of coordinates.
Instance Attribute Summary collapse
-
#first ⇒ Object
Returns the value of attribute first.
-
#last ⇒ Object
Returns the value of attribute last.
Class Method Summary collapse
-
.bounds(values) ⇒ Object
Returns a SimpleRange object that is large enough to exactly contain all values.
-
.overall_range(ranges) ⇒ Object
Takes an array of Boundaries and returns a Boundaries object that precisely encompasses them all.
Instance Method Summary collapse
-
#apply_margin!(margin) ⇒ Object
Apply a fixed margin on the Boundaries.
-
#distance ⇒ Object
Algebraic distance.
-
#extend(range) ⇒ Object
This function makes sures that the SimpleRange object is big enough to encompass what it currently does and the range SimpleRange object.
- #infinite? ⇒ Boolean
-
#initialize(first, last = nil) ⇒ SimpleRange
constructor
Create a new SimpleRange object that runs from first to last (last can be less than first).
-
#max ⇒ Object
Maximum value.
-
#min ⇒ Object
Minimum value.
- #nan? ⇒ Boolean
-
#override(override) ⇒ Object
Override the Boundaries with the contents of override.
-
#valid? ⇒ Boolean
Checks if the range is valid, that is both elements are finite numbers.
Constructor Details
#initialize(first, last = nil) ⇒ SimpleRange
Create a new SimpleRange object that runs from first to last (last can be less than first). A nil, false or NaN in one of those means unspecified.
Alternatively, first can be an object that responds to #first and #last.
37 38 39 40 41 42 43 44 45 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 37 def initialize(first, last = nil) if first.respond_to?(:first) @first = first.first @last = first.last else @first = first @last = last end end |
Instance Attribute Details
#first ⇒ Object
Returns the value of attribute first.
29 30 31 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 29 def first @first end |
#last ⇒ Object
Returns the value of attribute last.
29 30 31 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 29 def last @last end |
Class Method Details
.bounds(values) ⇒ Object
Returns a SimpleRange object that is large enough to exactly contain all values
125 126 127 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 125 def self.bounds(values) return SimpleRange.new(values.min, values.max) end |
.overall_range(ranges) ⇒ Object
Takes an array of Boundaries and returns a Boundaries object that precisely encompasses them all. Invalid floats are simply ignored.
132 133 134 135 136 137 138 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 132 def self.overall_range(ranges) retval = SimpleRange.new(nil, nil) for r in ranges retval.extend(b) end return retval end |
Instance Method Details
#apply_margin!(margin) ⇒ Object
Apply a fixed margin on the Boundaries.
117 118 119 120 121 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 117 def apply_margin!(margin) d = self.distance @first = @first - margin * d @last = @last + margin * d end |
#distance ⇒ Object
Algebraic distance
75 76 77 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 75 def distance return @last - @first end |
#extend(range) ⇒ Object
This function makes sures that the SimpleRange object is big enough to encompass what it currently does and the range SimpleRange object.
todo this does not work correctly in the case of reversed boundaries. I don’t think it can anyway.
Actually, it even works with normal Range elements !
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 87 def extend(range) # Left/right if (! @first.is_a? Float) or @first.nan? or (range.first && @first > range.first) @first = range.first end if (! @last.is_a? Float) or @last.nan? or (range.last && @last < range.last) @last = range.last end return self end |
#infinite? ⇒ Boolean
59 60 61 62 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 59 def infinite? return (Utils::infinite_number?(@first) or Utils::infinite_number?(@last)) end |
#max ⇒ Object
Maximum value
70 71 72 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 70 def max @first > @last ? @first : @last end |
#min ⇒ Object
Minimum value
65 66 67 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 65 def min @first < @last ? @first : @last end |
#nan? ⇒ Boolean
54 55 56 57 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 54 def nan? return (Utils::nan_number?(@first) or Utils::nan_number?(@last)) end |
#override(override) ⇒ Object
Override the Boundaries with the contents of override. All elements which are not nil or NaN from override precisely override those in self.
107 108 109 110 111 112 113 114 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 107 def override(override) for el in [ :first, :last] val = override.send(el) if val and (val == val) # Strip NaN on the property that NaN != NaN self.send("#{el}=", val) end end end |
#valid? ⇒ Boolean
Checks if the range is valid, that is both elements are finite numbers
49 50 51 52 |
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 49 def valid? return (Utils::finite_number?(@first) and Utils::finite_number?(@last)) end |