diff --git a/ShoulderCase/@RotatorCuff/plot.m b/ShoulderCase/@RotatorCuff/plot.m index 057e30e..e6644e1 100644 --- a/ShoulderCase/@RotatorCuff/plot.m +++ b/ShoulderCase/@RotatorCuff/plot.m @@ -1,40 +1,38 @@ function output = plot(obj,varargin) - % For now this function is specific to plotting the rotator cuff segmentation - % results if nargin == 2 error('Provide the slice name and the mask name or provide nothing (auto slice and segmentations will be plotted).') elseif nargin == 3 sliceName = varargin{1} + "_ForSegmentation.png"; maskName = varargin{2} + "_Mask.png"; else sliceName = "rotatorCuffMatthieu_ForSegmentation.png"; maskName = "autoMatthieu_Mask.png"; end rotatorCuffCrossSection = imread(fullfile(obj.dataSlicesPath,sliceName)); leg = {}; plotHandle(1) = imshow(rotatorCuffCrossSection); hold on muscleColor = containers.Map; muscleColor("SC") = "b"; muscleColor("SS") = "r"; muscleColor("IS") = "g"; muscleColor("TM") = "y"; for muscleName = ["SC", "SS", "IS", "TM"] try segmentedImage = imread(fullfile(obj.(muscleName).dataMaskPath,maskName)); catch continue end if (max(segmentedImage,[],'all') > 0) % if segmentation result is not empty leg{end+1} = muscleName; [~,plotHandle(end+1)] = contour(segmentedImage,'color',muscleColor(muscleName)); end end plotHandle(end+1) = legend(leg); output = plotHandle; end diff --git a/ShoulderCase/@RotatorCuff/plot3.m b/ShoulderCase/@RotatorCuff/plot3.m index 64528ec..fc824ae 100644 --- a/ShoulderCase/@RotatorCuff/plot3.m +++ b/ShoulderCase/@RotatorCuff/plot3.m @@ -1,23 +1,38 @@ function output = plot3(obj) muscleColor = containers.Map; muscleColor("SC") = "b"; muscleColor("SS") = "r"; muscleColor("IS") = "g"; muscleColor("TM") = "y"; plotHandle = []; for muscleName = ["SC", "SS", "IS", "TM"] try + % Plot segmentations centroidPoint = obj.(muscleName).getCentroid().coordinates; contourPoints = obj.(muscleName).getContour().coordinates; plotHandle(end+1) = scatter3(centroidPoint(:,1), centroidPoint(:,2), centroidPoint(:,3),... "MarkerEdgeColor", muscleColor(muscleName),... "MarkerFaceColor", muscleColor(muscleName)); hold on plotHandle(end+1) = scatter3(contourPoints(:,1), contourPoints(:,2), contourPoints(:,3),... "MarkerEdgeColor", muscleColor(muscleName)); + + + % Plot muscle insertion + humeralInsertion = obj.(muscleName).insertions; + plotHandle(end+1) = plot(... + Vector(obj.(muscleName).forceVector.origin, humeralInsertion),... + "Color", muscleColor(muscleName),... + "LineWidth", 2); + plotHandle(end+1) = scatter3(... + humeralInsertion(1),... + humeralInsertion(2),... + humeralInsertion(3),... + "MarkerFaceColor", muscleColor(muscleName),... + "MarkerEdgeColor", "magenta"); end end output = plotHandle; end \ No newline at end of file diff --git a/ShoulderCase/@Vector/Vector.m b/ShoulderCase/@Vector/Vector.m index f77d156..a9387a2 100644 --- a/ShoulderCase/@Vector/Vector.m +++ b/ShoulderCase/@Vector/Vector.m @@ -1,150 +1,162 @@ 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) + function output = plot(obj, varargin) points = obj.points; - plot3(points(:,1), points(:,2), points(:,3)); + 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) + 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 \ No newline at end of file