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_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