require "matrix"

module Geometry
	class Vector < Geometry::Point
		def scalar object
			if object.is_a? Vector
				([@coordenates, object.coordenates].transpose.map { |c| c.reduce :* }).reduce :+
			else
				self.class.new *@coordenates.map { |c| object * c }
			end
		end

		alias_method :dot, :scalar
		alias_method :inner, :scalar

		def cross vector
			self.class.new Matrix[[self.coordenates[1], self.coordenates[2]], [vector.coordenates[1], vector.coordenates[2]]].det, -1 * Matrix[[self.coordenates[0], self.coordenates[2]], [vector.coordenates[0], vector.coordenates[2]]].det, Matrix[[self.coordenates[0], self.coordenates[1]], [vector.coordenates[0], vector.coordenates[1]]].det
		end

		alias_method :vector, :cross

		def norm
			Math::sqrt inner self
		end

		def angle vector
			Math::acos self.inner(vector) / (self.norm * vector.norm)
		end

		def projection vector
			vector.inner self.inner(vector) / (vector.norm ** 2)
		end

		def perpendicular? vector
			self.inner vector == 0
		end
	end
end