diff --git a/ShoulderCase/@Vector/Vector.m b/ShoulderCase/@Vector/Vector.m index c1dcc83..bdff492 100644 --- a/ShoulderCase/@Vector/Vector.m +++ b/ShoulderCase/@Vector/Vector.m @@ -1,94 +1,121 @@ classdef Vector < handle properties origin target end methods - function obj = Vector(origin, target) + 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 end end \ No newline at end of file