classdef Vector < handle properties origin target end methods function obj = Vector(varargin) if nargin == 1 origin = [0 0 0]; target = varargin{1}; elseif nargin == 2 origin = varargin{1}; target = varargin{2}; else error("Vector constructor only accepts up to 2 arguments"); end obj.origin = origin; obj.target = target; end function output = copy(obj) output = Vector(obj.origin, obj.target); end function set.origin(obj, value) assert(isequal(size(value),[1,3]),"Origin must be a 1x3 double array") obj.origin = value; end function set.target(obj, value) assert(isequal(size(value),[1,3]),"Target must be a 1x3 double array") obj.target = value; end function output = points(obj) output = [obj.origin; obj.target]; end function output = vector(obj) output = obj.target - obj.origin; end function output = norm(obj) output = norm(obj.vector); end function output = direction(obj) output = obj.vector / obj.norm; end function output = orientToward(obj, orientationElement) if isequal(class(orientationElement),"Vector") orientation = orientationElement.vector; else orientation = orientationElement; end if dot(obj.vector, orientation) >= 0 output = obj.copy(); else output = -obj.copy(); end end function output = project(obj, projectedElement) % projectedElement must be either a point in 3D space (1x3 double array) % or another Vector. if isequal(class(projectedElement),"Vector") projectedVector = projectedElement; elseif isequal(size(projectedElement),[1,3]) projectedVector = Vector(obj.origin, projectedElement); end output = Vector(obj.origin, obj.origin + obj.direction*dot(projectedVector.vector,obj.direction)); end function output = orthogonalComplementToPoint(obj, point) output = -obj.project(point) + Vector(obj.origin, point); end function output = plot(obj, varargin) points = obj.points; plotHandle = plot3(points(:,1), points(:,2), points(:,3), varargin{:}); output = plotHandle; end function output = uminus(obj) output = Vector(obj.target, obj.origin); end function output = plus(obj, addedVector) if isequal(class(addedVector),"Vector") output = Vector(obj.origin, obj.target + addedVector.vector); elseif isequal(size(addedVector),[1,3]) output = Vector(obj.origin, obj.target + addedVector); end end function output = minus(obj, substractedVector) if isequal(class(substractedVector),"Vector") output = obj + -substractedVector; elseif isequal(size(substractedVector),[1,3]) output = Vector(obj.origin, obj.target - substractedVector); end end function output = mtimes(left, right) if isequal(class(left),"Vector") vectorObject = left; coefficient = right; else vectorObject = right; coefficient = left; end output = Vector(vectorObject.origin, vectorObject.origin + coefficient*vectorObject.vector); end function output = mrdivide(left, right) if isequal(class(left),"Vector") vectorObject = left; coefficient = right; else vectorObject = right; coefficient = left; end output = Vector(vectorObject.origin, vectorObject.origin + vectorObject.vector/coefficient); end function output = dot(obj, inputVector) if isequal(class(inputVector),"Vector") array = inputVector.vector; else array = inputVector; end output = dot(obj.vector, array); end function output = cross(obj, inputVector) if isequal(class(inputVector),"Vector") array = inputVector.vector; else array = inputVector; end output = Vector(obj.origin, obj.origin + cross(obj.vector, array)); end function output = angle(obj, inputVector) if isequal(class(inputVector),"Vector") array = inputVector.vector; else array = inputVector; end rotation = vrrotvec(obj.vector, array); output = rotation(4); end end end