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