lib/mittsu/math/vector2.rb in mittsu-0.1.1 vs lib/mittsu/math/vector2.rb in mittsu-0.1.2
- old
+ new
@@ -1,238 +1,39 @@
require 'mittsu/math'
+require 'mittsu/math/vector'
module Mittsu
- class Vector2
- attr_reader :x, :y
+ class Vector2 < Vector
+ ELEMENTS = { x: 0, y: 1 }
+ DIMENSIONS = ELEMENTS.count
def initialize(x = 0, y = 0)
- @x = x.to_f
- @y = y.to_f
+ super [x.to_f, y.to_f]
end
- def x=(value)
- @x = value.to_f
- end
-
- def y=(value)
- @y = value.to_f
- end
-
def set(x, y)
- @x = x.to_f
- @y = y.to_f
- self
+ super [x.to_f, y.to_f]
end
- def []=(index, value)
- return @x = value.to_f if index == 0
- return @y = value.to_f if index == 1
- raise IndexError
- end
+ def x; @elements[0]; end
+ def y; @elements[1]; end
- def [](index)
- return @x if index == 0
- return @y if index == 1
- raise IndexError
- end
+ def x=(value); @elements[0] = value.to_f; end
+ def y=(value); @elements[1] = value.to_f; end
- def copy(v)
- @x = v.x
- @y = v.y
- self
- end
-
- def add(v)
- @x += v.x
- @y += v.y
- self
- end
-
- def add_scalar(s)
- @x += s
- @y += s
- self
- end
-
- def add_vectors(a, b)
- @x = a.x + b.x
- @y = a.y + b.y
- self
- end
-
- def sub(v)
- @x -= v.x
- @y -= v.y
- self
- end
-
- def sub_scalar(s)
- @x -= s
- @y -= s
- self
- end
-
- def sub_vectors(a, b)
- @x = a.x - b.x
- @y = a.y - b.y
- self
- end
-
- def multiply(v)
- @x *= v.x
- @y *= v.y
- self
- end
-
- def multiply_scalar(s)
- @x *= s
- @y *= s
- self
- end
-
- def divide(v)
- @x /= v.x
- @y /= v.y
- self
- end
-
- def divide_scalar(s)
- @x /= s
- @y /= s
- self
- end
-
- def min(v)
- @x = [@x, v.x].min
- @y = [@y, v.y].min
- self
- end
-
- def max(v)
- @x = [@x, v.x].max
- @y = [@y, v.y].max
- self
- end
-
- def clamp(min, max)
- @x = Math.clamp(@x, min.x, max.x)
- @y = Math.clamp(@y, min.y, max.y)
- self
- end
-
- def clamp_scalar(min, max)
- min, max = min.to_f, max.to_f
- @x = Math.clamp(@x, min, max)
- @y = Math.clamp(@y, min, max)
- self
- end
-
- def floor
- @x = @x.floor.to_f
- @y = @y.floor.to_f
- self
- end
-
- def ceil
- @x = @x.ceil.to_f
- @y = @y.ceil.to_f
- self
- end
-
- def round
- @x = @x.round.to_f
- @y = @y.round.to_f
- self
- end
-
- def round_to_zero
- @x = ( @x < 0 ) ? @x.ceil.to_f : @x.floor.to_f
- @y = ( @y < 0 ) ? @y.ceil.to_f : @y.floor.to_f
- self
- end
-
- def negate
- @x = -@x
- @y = -@y
- self
- end
-
def dot(v)
- @x * v.x + @y * v.y
+ x * v.x + y * v.y
end
- def length
- Math.sqrt(length_sq)
- end
-
- def length_sq
- self.dot(self)
- end
-
- def normalize
- self.divide_scalar(self.length)
- end
-
- def distance_to(v)
- Math.sqrt(distance_to_squared(v))
- end
-
def distance_to_squared(v)
- dx, dy = @x - v.x, @y - v.y
+ dx, dy = x - v.x, y - v.y
dx * dx + dy * dy
end
- def set_length(l)
- old_length = self.length
- if old_length != 0 && l != old_length
- self.multiply_scalar(l / old_length)
- end
- self
- end
-
- def lerp(v, alpha)
- @x += (v.x - @x) * alpha
- @y += (v.y - @y) * alpha
- self
- end
-
- def lerp_vectors(v1, v2, alpha)
- self.sub_vectors(v2, v1).multiply_scalar(alpha).add(v1);
- end
-
- def ==(v)
- v.x == @x && v.y == @y
- end
-
- def from_array(array, offset = 0)
- @x = array[offset]
- @y = array[offset + 1]
- self
- end
-
- def to_array(array = [], offset = 0)
- array.tap { |a|
- a[offset] = @x;
- a[offset + 1] = @y;
- }
- end
-
- def to_a
- self.to_array
- end
-
def from_attribute(attribute, index, offset = 0)
index = index * attribute.item_size + offset
- @x = attribute.array[index]
- @y = attribute.array[index + 1]
+ @elements[0] = attribute.array[index]
+ @elements[1] = attribute.array[index + 1]
self
- end
-
- def clone
- Vector2.new(@x, @y)
- end
-
- def to_s
- "[#{x}, #{y}]"
end
end
end