diff --git a/ShoulderCase/@Humerus/loadFittingSphereLandmarks.m b/ShoulderCase/@Humerus/loadFittingSphereLandmarks.m index da811f4..81d2422 100644 --- a/ShoulderCase/@Humerus/loadFittingSphereLandmarks.m +++ b/ShoulderCase/@Humerus/loadFittingSphereLandmarks.m @@ -1,6 +1,6 @@ function loadFittingSphereLandmarks(obj) landmarksFilename = fullfile(... obj.shoulder.SCase.dataSlicerPath,... "HH_landmarks_fitting_sphere_" + obj.shoulder.side + ".mrk.json"); - obj.landmarks.sphere = obj.getSlicerLandmarks(landmarksFilename); + obj.landmarks.sphere = obj.readSlicerLandmarks(landmarksFilename); end \ No newline at end of file diff --git a/ShoulderCase/@Humerus/loadSlicerLandmarks.m b/ShoulderCase/@Humerus/loadSlicerLandmarks.m index 20dd09b..d9118b4 100644 --- a/ShoulderCase/@Humerus/loadSlicerLandmarks.m +++ b/ShoulderCase/@Humerus/loadSlicerLandmarks.m @@ -1,6 +1,5 @@ function output = loadSlicerLandmarks(obj) obj.landmarks = []; obj.loadFittingSphereLandmarks(); - obj.loadInsertionsRingLandmarks(); - obj.loadInsertionsExtremitiesLandmarks(); + obj.loadInsertionsLandmarks(); end diff --git a/ShoulderCase/@Humerus/measureInsertionsRing.m b/ShoulderCase/@Humerus/measureInsertionsRing.m index ebca47a..bee1ce7 100644 --- a/ShoulderCase/@Humerus/measureInsertionsRing.m +++ b/ShoulderCase/@Humerus/measureInsertionsRing.m @@ -1,24 +1,27 @@ function measureInsertionsRing(obj) % The insertions ring is the intersection of the plane fitted to the % insertions' landmarks with the humeral head fitted sphere. - insertionsArray = struct2array(obj.landmarks.insertions.ring)'; + insertionsArray = [... + obj.landmarks.insertions.subscapularis_inferior';... + obj.landmarks.insertions.supraspinatus_anterior';... + obj.landmarks.insertions.teres_minor_inferior']; insertionsPlane = Plane(); insertionsPlane.fit(insertionsArray); ringNormal = Vector(insertionsPlane.normal); humerusCenterToPlanePoint = Vector(obj.center, insertionsPlane.point); % The ring's center is the projection of any point of the insertions' plane % on the vector starting at the humeral head center and with the same % direction as the insertion's plane normal direction. ringCenter = obj.center... + (ringNormal.dot(humerusCenterToPlanePoint) * ringNormal.vector); humerusCenterToRingCenter = Vector(obj.center, ringCenter); ringRadius = sqrt(obj.radius^2 - humerusCenterToRingCenter.norm()^2); obj.insertionsRing.center = ringCenter; obj.insertionsRing.radius = ringRadius; obj.insertionsRing.normal = ringNormal; end \ No newline at end of file diff --git a/ShoulderCase/@Muscle/measureInsertion.m b/ShoulderCase/@Muscle/measureInsertion.m index df11305..dadcf87 100644 --- a/ShoulderCase/@Muscle/measureInsertion.m +++ b/ShoulderCase/@Muscle/measureInsertion.m @@ -1,70 +1,70 @@ function measureInsertion(obj, humerus) % Find and return the point for which the sidemost muscle's segmentation % centroids are coplanar with muscle's insertion extremities and humerus center. % This unique point insertion equivalent can then be used with existing % methods to compute the muscle's fibres contact points. insertionsExtremities =... - humerus.landmarks.insertions.extremities.(obj.getFullName())'; + humerus.getInsertionsExtremitiesByMuscle.(obj.getFullName())'; insertionsExtremities =... projectOnInsertionsRing(insertionsExtremities, humerus.insertionsRing); insertionDirection =... Vector(insertionsExtremities(1,:), insertionsExtremities(2,:)); centroidsCenter = mean(obj.centroid); centroidsPositionAlongInsertion = getCentroidsPositionAlongInsertion(... obj.centroid, insertionDirection); insertion = []; for i = 1:size(obj.centroid, 1) insertion(i,:) = getFibreInsertion(centroidsPositionAlongInsertion(i),... insertionsExtremities, humerus.insertionsRing); end obj.insertion = insertion; end function output = getCentroidsPositionAlongInsertion(... centroids, insertionDirection) centroidCenter = mean(centroids); centroidsPositionAlongInsertion = []; for i = 1:size(centroids, 1) centroid = Vector(centroidCenter, centroids(i,:)); centroidsPositionAlongInsertion(i) = insertionDirection.dot(centroid); end normalisedCentroidsPositionAlongInsertion =... (centroidsPositionAlongInsertion - min(centroidsPositionAlongInsertion))... / (max(centroidsPositionAlongInsertion)... - min(centroidsPositionAlongInsertion)); output = normalisedCentroidsPositionAlongInsertion; end function output = getFibreInsertion(... fibreRelativePosition, insertionsExtremities, insertionsRing) insertionRingCenterToInsertionExtremities = [... Vector(insertionsRing.center, insertionsExtremities(1,:));... Vector(insertionsRing.center, insertionsExtremities(2,:))]; insertionApertureAngle = insertionRingCenterToInsertionExtremities(2).angle(... insertionRingCenterToInsertionExtremities(1)); fibreApertureAngle = fibreRelativePosition * insertionApertureAngle; insertionPlaneNormal = insertionRingCenterToInsertionExtremities(2).cross(... insertionRingCenterToInsertionExtremities(1)).direction; humerusCenterToFibreInsertion = quatrotate(... quaternion(fibreApertureAngle * insertionPlaneNormal, "rotvec").compact,... insertionRingCenterToInsertionExtremities(1).vector); fibreInsertion = insertionsRing.center + humerusCenterToFibreInsertion; output = fibreInsertion; end function output = projectOnInsertionsRing(points, insertionsRing) projectedPoints = []; for i = 1:size(points, 1) ringCenterToPoint = Vector(insertionsRing.center, points(i,:)); projectedPoints(i,:) =... insertionsRing.center ... + insertionsRing.radius * ringCenterToPoint.direction; end output = projectedPoints; end \ No newline at end of file