class GeometricVector < Struct.new(:x, :y) def self.new_by_array(array) self.new(array[0], array[1]) end def ==(vector) x === vector.x && y === vector.y end def +(vector) GeometricVector.new(x + vector.x, y + vector.y) end def -(vector) self + (-1) * vector end def *(scalar) GeometricVector.new(x * scalar, y * scalar) end def coerce(scalar) if scalar.is_a?(Numeric) [self, scalar] else raise ArgumentError, "GeometricVector: cannot coerce #{scalar.inspect}" end end def cross_product(vector) x * vector.y - y * vector.x end def scalar_product(vector) x * vector.x + y * vector.y end def collinear_with?(vector) cross_product(vector) === 0 end def modulus Math.hypot(x ,y) end end