class Vec2i attr_accessor :x attr_accessor :y def initialize(x = 0, y = 0) @x = x @y = y end def abs Vec2i.new(@x.abs, @y.abs) end def abs! @x = @x.abs @y = @y.abs end def magnitute Math.sqrt(@x * @x + @y * @y) end def distance_to(other) if other.is_a? Integer Vec2i.new( @x - other, @y - other ).magnitute elsif other.is_a? Float Vec2i.new( @x - other.to_i, @y - other.to_i ).magnitute elsif other.is_a? Vec2i Vec2i.new( @x - other.x, @y - other.y ).magnitute else raise "Impossible to get distance to an object of type #{other.class} to #{self.class}" end end def +(other) if other.is_a? Integer Vec2i.new( @x + other, @y + other ) elsif other.is_a? Float Vec2i.new( @x + other.to_i, @y + other.to_i ) elsif other.is_a? Vec2i Vec2i.new( @x + other.x, @y + other.y ) else raise "Impossible to add an object of type #{other.class} to #{self.class}" end end def -(other) if other.is_a? Integer Vec2i.new( @x - other, @y - other ) elsif other.is_a? Float Vec2i.new( @x - other.to_i, @y - other.to_i ) elsif other.is_a? Vec2i Vec2i.new( @x - other.x, @y - other.y ) else raise "Impossible to subtract an object of type #{other.class} to #{self.class}" end end def *(other) if other.is_a? Integer Vec2i.new( @x * other, @y * other ) elsif other.is_a? Float Vec2i.new( @x * other.to_i, @y * other.to_i ) elsif other.is_a? Vec2i Vec2i.new( @x * other.x, @y * other.y ) else raise "Impossible to add an object of type #{other.class} to #{self.class}" end end def /(other) if other.is_a? Integer Vec2i.new( @x / other, @y / other ) elsif other.is_a? Float Vec2i.new( @x / other.to_i, @y / other.to_i ) elsif other.is_a? Vec2i Vec2i.new( @x / other.x, @y / other.y ) else raise "Impossible to subtract an object of type #{other.class} to #{self.class}" end end end