Class: CTioga2::Graphics::Types::SimpleRange

Inherits:
Object
  • Object
show all
Defined in:
lib/ctioga2/graphics/types/boundaries.rb

Overview

A range of coordinates.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#firstObject

Returns the value of attribute first.



29
30
31
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 29

def first
  @first
end

#lastObject

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

#distanceObject

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

Returns:

  • (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

#maxObject

Maximum value



70
71
72
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 70

def max
  @first > @last ? @first : @last
end

#minObject

Minimum value



65
66
67
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 65

def min
  @first < @last ? @first : @last
end

#nan?Boolean

Returns:

  • (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

Returns:

  • (Boolean)


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