diff --git a/ShoulderCase/@Vector/Vector.m b/ShoulderCase/@Vector/Vector.m index bdff492..b6a5ec6 100644 --- a/ShoulderCase/@Vector/Vector.m +++ b/ShoulderCase/@Vector/Vector.m @@ -1,121 +1,150 @@ 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 plot(obj) points = obj.points; plot3(points(:,1), points(:,2), points(:,3)); 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.origin - 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 = 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 \ No newline at end of file