diff --git a/ShoulderCase/@Muscle/measureForceVector.m b/ShoulderCase/@Muscle/measureForceVector.m index 434ab2b..bf00aeb 100644 --- a/ShoulderCase/@Muscle/measureForceVector.m +++ b/ShoulderCase/@Muscle/measureForceVector.m @@ -1,5 +1,5 @@ function measureForceVector(obj) - force = Vector(obj.getCentroid().coordinates, obj.insertions); + force = Vector(obj.insertions, obj.getCentroid().coordinates); force = force*obj.PCSA / force.norm; obj.forceVector = force; end \ No newline at end of file diff --git a/ShoulderCase/@RotatorCuff/RotatorCuff.m b/ShoulderCase/@RotatorCuff/RotatorCuff.m index dbbb6ce..27a4135 100644 --- a/ShoulderCase/@RotatorCuff/RotatorCuff.m +++ b/ShoulderCase/@RotatorCuff/RotatorCuff.m @@ -1,100 +1,100 @@ classdef RotatorCuff < handle properties SC SS IS TM anteroPosteriorImbalance = nan; shoulder; end methods function obj = RotatorCuff(shoulder) obj.shoulder = shoulder; obj.SC = Muscle(obj, "SC"); obj.SS = Muscle(obj, "SS"); obj.IS = Muscle(obj, "IS"); obj.TM = Muscle(obj, "TM"); [~, ~] = mkdir(obj.dataPath); [~, ~] = mkdir(obj.dataSlicesPath); end function output = dataPath(obj) output = fullfile(obj.shoulder.dataPath, "muscles"); end function output = dataSlicesPath(obj) output = fullfile(obj.dataPath, "oblique_slices"); end function output = summary(obj) summary = []; summary = [summary; obj.SC.summary]; summary = [summary; obj.SS.summary]; summary = [summary; obj.IS.summary]; summary = [summary; obj.TM.summary]; output = summary; end function output = measure(obj, sliceName, segmentationSet) try obj.measureDegenerations(sliceName, segmentationSet); obj.measureInsertions(); obj.measureAnteroPosteriorImbalance(); end output = obj.summary; end function measureDegenerations(obj, sliceName, segmentationSet) for muscleName = ["SC", "SS", "IS", "TM"] obj.(muscleName).measureDegeneration(sliceName, segmentationSet); end end function measureInsertions(obj) humerus = obj.shoulder.humerus; humeralHead = Sphere(humerus.center, humerus.radius); % IS humeral insertion estimation obj.IS.measureInsertionTangentToSphere(... humeralHead,... obj.shoulder.scapula.coordSys.IS,... -obj.shoulder.scapula.coordSys.PA); obj.IS.measureForceVector(); % SC humeral insertion estimation obj.SC.measureInsertionTangentToSphere(... humeralHead,... obj.shoulder.scapula.coordSys.IS,... obj.shoulder.scapula.coordSys.PA); obj.SC.measureForceVector(); end function measureAnteroPosteriorImbalance(obj) forceSC = obj.SC.forceVector; forceIS = obj.IS.forceVector; scapula = obj.shoulder.scapula; inferoSuperior = Vector(scapula.coordSys.origin,... scapula.coordSys.origin + scapula.coordSys.IS); % Take infero-superior orthogonal component <=> project on scapular axial plane forceSCAxial = inferoSuperior.orthogonalComplementToPoint(... inferoSuperior.origin + forceSC.vector); forceISAxial = inferoSuperior.orthogonalComplementToPoint(... inferoSuperior.origin + forceIS.vector); - medioLateral = Vector(scapula.coordSys.origin,... - scapula.coordSys.origin + scapula.coordSys.ML); + lateroMedial = Vector(scapula.coordSys.origin,... + scapula.coordSys.origin - scapula.coordSys.ML); posteroAnterior = Vector(scapula.coordSys.origin,... scapula.coordSys.origin + scapula.coordSys.PA); imbalanceVector = forceSCAxial + forceISAxial; obj.anteroPosteriorImbalance = ... - sign(dot(imbalanceVector, -posteroAnterior)) * rad2deg(medioLateral.angle(imbalanceVector)); + sign(dot(imbalanceVector, -posteroAnterior)) * rad2deg(lateroMedial.angle(imbalanceVector)); end end end \ No newline at end of file diff --git a/ShoulderCase/@RotatorCuff/plot3.m b/ShoulderCase/@RotatorCuff/plot3.m index fc824ae..85942c3 100644 --- a/ShoulderCase/@RotatorCuff/plot3.m +++ b/ShoulderCase/@RotatorCuff/plot3.m @@ -1,38 +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),... + Vector(centroidPoint, 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