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.



39
40
41
42
43
44
45
46
47
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 39

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.



31
32
33
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 31

def first
  @first
end

#lastObject

Returns the value of attribute last.



31
32
33
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 31

def last
  @last
end

Class Method Details

.bounds(values) ⇒ Object

Returns a SimpleRange object that is large enough to exactly contain all values



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

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.



116
117
118
119
120
121
122
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 116

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.



101
102
103
104
105
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 101

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

#distanceObject

Algebraic distance



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

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 !



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 72

def extend(range)
  # Left/right
  if (! @first.is_a? Float) or @first.nan? or
      (@first > range.first)
    @first = range.first
  end

  if (! @last.is_a? Float) or @last.nan? or
      (@last < range.last)
    @last = range.last
  end

  return self
end

#maxObject

Maximum value



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

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

#minObject

Minimum value



50
51
52
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 50

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.



91
92
93
94
95
96
97
98
# File 'lib/ctioga2/graphics/types/boundaries.rb', line 91

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