class Mittsu::Vector

Attributes

elements[RW]
index[RW]
uv[RW]

Public Class Methods

new(elements) click to toggle source
# File lib/mittsu/math/vector.rb, line 5
def initialize(elements)
  @elements = elements
end

Public Instance Methods

==(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 221
def ==(v)
  each_dimension do |i|
    return false if @elements[i] != v.elements[i]
  end
  true
end
[](index) click to toggle source
# File lib/mittsu/math/vector.rb, line 26
def [](index)
  index = self.class::ELEMENTS[index] if index.is_a?(Symbol)
  raise IndexError if index.nil? || index < 0 || index >= self.class::DIMENSIONS
  @elements[index]
end
[]=(index, value) click to toggle source
# File lib/mittsu/math/vector.rb, line 20
def []=(index, value)
  index = self.class::ELEMENTS[index] if index.is_a?(Symbol)
  raise IndexError if index.nil? || index < 0 || index >= self.class::DIMENSIONS
  @elements[index] = value
end
add(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 37
def add(v)
  each_dimension do |i|
    @elements[i] = @elements[i] + v.elements[i]
  end
  self
end
add_scalar(s) click to toggle source
# File lib/mittsu/math/vector.rb, line 44
def add_scalar(s)
  @elements.map!{ |e| e + s }
  self
end
add_vectors(a, b) click to toggle source
# File lib/mittsu/math/vector.rb, line 49
def add_vectors(a, b)
  each_dimension do |i|
    @elements[i] = a.elements[i] + b.elements[i]
  end
  self
end
angle_to(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 210
def angle_to(v)
  theta = self.dot(v) / (self.length * v.length)

  # clamp, to handle numerical problems
  ::Math.acos(Math.clamp(theta, -1.0, 1.0))
end
ceil() click to toggle source
# File lib/mittsu/math/vector.rb, line 138
def ceil
  @elements.map!{ |e| e.ceil.to_f }
  self
end
clamp(min, max) click to toggle source
# File lib/mittsu/math/vector.rb, line 121
def clamp(min, max)
  each_dimension do |i|
    @elements[i] = Math.clamp(@elements[i], min.elements[i], max.elements[i])
  end
  self
end
clamp_scalar(min, max) click to toggle source
# File lib/mittsu/math/vector.rb, line 128
def clamp_scalar(min, max)
  @elements.map!{ |e| Math.clamp(e, min, max) }
  self
end
clone() click to toggle source
# File lib/mittsu/math/vector.rb, line 243
def clone
  self.class.new(*@elements)
end
copy(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 32
def copy(v)
  @elements = v.elements.dup
  self
end
distance_to(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 217
def distance_to(v)
  ::Math.sqrt(self.distance_to_squared(v))
end
divide(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 94
def divide(v)
  each_dimension do |i|
    @elements[i] = @elements[i] / v.elements[i]
  end
  self
end
divide_scalar(s) click to toggle source
# File lib/mittsu/math/vector.rb, line 101
def divide_scalar(s)
  inv_scalar = s == 0 ? 0 : 1.0 / s
  @elements.map!{ |e| e * inv_scalar }
  self
end
each_dimension() { |i| ... } click to toggle source
# File lib/mittsu/math/vector.rb, line 14
def each_dimension
  self.class::DIMENSIONS.times do |i|
    yield i
  end
end
floor() click to toggle source
# File lib/mittsu/math/vector.rb, line 133
def floor
  @elements.map!{ |e| e.floor.to_f }
  self
end
from_array(array, offset = 0) click to toggle source
# File lib/mittsu/math/vector.rb, line 228
def from_array(array, offset = 0)
  each_dimension do |i|
    @elements[i] = array[offset + i]
  end
  self
end
length() click to toggle source
# File lib/mittsu/math/vector.rb, line 162
def length
  ::Math.sqrt(length_sq)
end
length_sq() click to toggle source
# File lib/mittsu/math/vector.rb, line 158
def length_sq
  self.dot(self)
end
lerp(v, alpha) click to toggle source
# File lib/mittsu/math/vector.rb, line 178
def lerp(v, alpha)
  each_dimension do |i|
    @elements[i] += (v.elements[i] - @elements[i]) * alpha
  end
  self
end
lerp_vectors(v1, v2, alpha) click to toggle source
# File lib/mittsu/math/vector.rb, line 185
def lerp_vectors(v1, v2, alpha)
  self.sub_vectors(v2, v1).multiply_scalar(alpha).add(v1)
  self
end
max(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 114
def max(v)
  each_dimension do |i|
    @elements[i] = v.elements[i] if @elements[i] < v.elements[i]
  end
  self
end
min(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 107
def min(v)
  each_dimension do |i|
    @elements[i] = v.elements[i] if @elements[i] > v.elements[i]
  end
  self
end
multiply(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 75
def multiply(v)
  each_dimension do |i|
    @elements[i] = @elements[i] * v.elements[i]
  end
  self
end
multiply_scalar(s) click to toggle source
# File lib/mittsu/math/vector.rb, line 82
def multiply_scalar(s)
  @elements.map!{ |e| e * s }
  self
end
multiply_vectors(a, b) click to toggle source
# File lib/mittsu/math/vector.rb, line 87
def multiply_vectors(a, b)
  each_dimension do |i|
    @elements[i] = a.elements[i] * b.elements[i]
  end
  self
end
negate() click to toggle source
# File lib/mittsu/math/vector.rb, line 153
def negate
  @elements.map!{ |e| -e }
  self
end
normalize() click to toggle source
# File lib/mittsu/math/vector.rb, line 166
def normalize
  self.divide_scalar(self.length)
end
project_on_plane(plane_normal) click to toggle source
# File lib/mittsu/math/vector.rb, line 197
def project_on_plane(plane_normal)
  v1 = self.class.new
  v1.copy(self).project_on_vector(plane_normal)
  self.sub(v1)
end
project_on_vector(vector) click to toggle source
# File lib/mittsu/math/vector.rb, line 190
def project_on_vector(vector)
  v1 = self.class.new
  v1.copy(vector).normalize
  dot = self.dot(v1)
  self.copy(v1).multiply_scalar(dot)
end
reflect(normal) click to toggle source
# File lib/mittsu/math/vector.rb, line 203
def reflect(normal)
  # reflect incident vector off plane orthogonal to normal
  # normal is assumed to have unit length
  v1 = self.class.new
  self.sub(v1.copy(normal).multiply_scalar(2.0 * self.dot(normal)))
end
round() click to toggle source
# File lib/mittsu/math/vector.rb, line 143
def round
  @elements.map!{ |e| e.round.to_f }
  self
end
round_to_zero() click to toggle source
# File lib/mittsu/math/vector.rb, line 148
def round_to_zero
  @elements.map!{ |e| (e < 0) ? e.ceil.to_f : e.floor.to_f }
  self
end
set(elements) click to toggle source
# File lib/mittsu/math/vector.rb, line 9
def set(elements)
  @elements = elements
  self
end
set_length(l) click to toggle source
# File lib/mittsu/math/vector.rb, line 170
def set_length(l)
  old_length = self.length
  if old_length != 0 && l != old_length
    self.multiply_scalar(l / old_length)
  end
  self
end
sub(v) click to toggle source
# File lib/mittsu/math/vector.rb, line 56
def sub(v)
  each_dimension do |i|
    @elements[i] = @elements[i] - v.elements[i]
  end
  self
end
sub_scalar(s) click to toggle source
# File lib/mittsu/math/vector.rb, line 63
def sub_scalar(s)
  @elements.map!{ |e| e - s }
  self
end
sub_vectors(a, b) click to toggle source
# File lib/mittsu/math/vector.rb, line 68
def sub_vectors(a, b)
  each_dimension do |i|
    @elements[i] = a.elements[i] - b.elements[i]
  end
  self
end
to_a(array = [], offset = 0)
Alias for: to_array
to_array(array = [], offset = 0) click to toggle source
# File lib/mittsu/math/vector.rb, line 235
def to_array(array = [], offset = 0)
  each_dimension do |i|
    array[offset + i] = @elements[i]
  end
  array
end
Also aliased as: to_a
to_s() click to toggle source
# File lib/mittsu/math/vector.rb, line 247
def to_s
  "[#{@elements.join(', ')}]"
end