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



115
116
117
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 115

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.



122
123
124
125
126
127
128
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 122

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.



107
108
109
110
111
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 107

def apply_margin!(margin)
  d = self.distance
  @first = @first - margin * d
  @last = @last + margin * d
end

#distanceObject

Algebraic distance



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

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 !



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 77

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

#maxObject

Maximum value



60
61
62
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 60

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

#minObject

Minimum value



55
56
57
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 55

def min
  @first < @last ? @first : @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.



97
98
99
100
101
102
103
104
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 97

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