{"id":2788,"date":"2018-02-20T18:30:00","date_gmt":"2018-02-20T23:30:00","guid":{"rendered":"https:\/\/blogs.mathworks.com\/steve\/?p=2788"},"modified":"2019-11-01T19:50:23","modified_gmt":"2019-11-01T23:50:23","slug":"minimum-feret-diameter","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/steve\/2018\/02\/20\/minimum-feret-diameter\/","title":{"rendered":"Minimum Feret Diameter"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p><a href=\"https:\/\/blogs.mathworks.com\/steve\/2017\/10\/24\/feret-diameters-and-antipodal-vertices\/\">Last time<\/a> (if you can remember that long ago), I talked about how to find the maximum <i>Feret diameter<\/i> of a shape. The Feret diameter, sometimes called the <i>caliper diameter<\/i>, is illustrated by the diagram below. In a virtual sense, place the object to be measured inside the jaws of a caliper, with the caliper oriented at a specified angle. Close the jaws tightly on the object while maintaining that angle. The distance between the jaws is the Feret diameter at that angle.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/caliper-dimensions.png\" alt=\"\"> <\/p><p>In the last post, I demonstrated how to find all the <i>antipodal<\/i> vertex pairs of a shape, which is a useful step in finding the maximum Feret diameters of a shape.<\/p><p>Here is a convex shape with all of the antipodal vertex pairs shown.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_2_04.png\" alt=\"\"> <\/p><p>It turns out that the <b>minimum<\/b> Feret diameter can also be found by looking at these antipodal pairs. Furthermore, it happens that the minimum-distance Feret calipers touch the shape at <b>three<\/b> of these vertices. I'm not going to try to prove that here, but let me illustrate it with a couple of diagrams.<\/p><p>Here is a shape with a couple of \"caliper lines\" drawn at -30 degrees. (Note that the y-axis is reversed; that's why the angle is negative.)<\/p><!--\/introduction--><pre class=\"codeinput\">hull = [\r\n    2.5000    5.5000\r\n    3.5000    4.5000\r\n    6.5000    2.5000\r\n    9.5000    1.5000\r\n   10.5000    1.5000\r\n   10.5000    3.5000\r\n    9.5000    5.5000\r\n    5.5000    7.5000\r\n    2.5000    7.5000\r\n    2.5000    5.5000  ];\r\n\r\nplot(hull(:,1),hull(:,2),<span class=\"string\">'r'<\/span>,<span class=\"string\">'LineWidth'<\/span>,2)\r\naxis <span class=\"string\">equal<\/span>\r\naxis <span class=\"string\">ij<\/span>\r\naxis([0 15 0 10])\r\nhold <span class=\"string\">on<\/span>\r\nplot(hull(:,1),hull(:,2),<span class=\"string\">'r*'<\/span>)\r\n[x1,y1] = fullLine(gca,[9.5 5.5],-30);\r\n[x2,y2] = fullLine(gca,[6.5 2.5],-30);\r\ncaliper_lines(1) = plot(x1,y1,<span class=\"string\">'k'<\/span>);\r\ncaliper_lines(2) = plot(x2,y2,<span class=\"string\">'k'<\/span>);\r\nhold <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_01.png\" alt=\"\"> <p>You can always rotate these two caliper lines, by the same angle, until at least one of them touches the <b>next<\/b> antipodal vertex. When you do that rotation, the distance between the lines shrinks.<\/p><pre class=\"codeinput\">set(caliper_lines,<span class=\"string\">'Color'<\/span>,[0.8 0.8 0.8]);\r\n[x3,y3] = fullLine(gca,[9.5 5.5],thetad);\r\n[x4,y4] = fullLine(gca,[6.5 2.5],thetad);\r\nhold <span class=\"string\">on<\/span>\r\nplot(x3,y3,<span class=\"string\">'k'<\/span>)\r\nplot(x4,y4,<span class=\"string\">'k'<\/span>)\r\nhold <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_02.png\" alt=\"\"> <p>The Feret diameter at that rotated angle, then, is the height of the triangle formed by the three vertices, with the base of the triangle defined by the two vertices touched by the same caliper line.<\/p><pre class=\"codeinput\">delete(caliper_lines);\r\nhold <span class=\"string\">on<\/span>\r\nplot([5.5 9.5 6.5 5.5],[7.5 5.5 2.5 7.5],<span class=\"string\">'Color'<\/span>,<span class=\"string\">'b'<\/span>,<span class=\"string\">'LineWidth'<\/span>,2)\r\nhold <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_03.png\" alt=\"\"> <p>The function <tt>minFeretDiameter<\/tt>, which appears at the end of this post, simply walks around the set of adjacent-vertex triangles formed from antipodal vertex pairs, looking for the triangle with the minimum height.<\/p><p>Let's look for the minimum Feret diameter in a slightly more interesting shape.<\/p><pre class=\"codeinput\">load <span class=\"string\">shape<\/span>\r\nplot(bx,by,<span class=\"string\">'LineWidth'<\/span>,1)\r\naxis <span class=\"string\">equal<\/span>\r\naxis <span class=\"string\">ij<\/span>\r\naxis([0 650 0 650])\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_04.png\" alt=\"\"> <p>Find the convex hull, making sure to simplify it, and then find the antipodal pairs. (I showed the function <tt>antipodalPairs<\/tt> in my previous post.)<\/p><pre class=\"codeinput\">hull = convhull(bx,by,<span class=\"string\">'Simplify'<\/span>,true);\r\nS = [bx(hull) by(hull)];\r\npairs = antipodalPairs(S);\r\n<\/pre><p>Now we can call <tt>minFeretDiameter<\/tt>.<\/p><pre class=\"codeinput\">[d,tri_points] = minFeretDiameter(S,pairs)\r\n<\/pre><pre class=\"codeoutput\">\r\nd =\r\n\r\n  318.7890\r\n\r\n\r\ntri_points =\r\n\r\n   613   211\r\n   459   443\r\n   239   198\r\n\r\n<\/pre><p>Superimpose the minimum-height triangle that <tt>minFeretDiameter<\/tt> found.<\/p><pre class=\"codeinput\">tri_points = [tri_points; tri_points(1,:)];\r\nhold <span class=\"string\">on<\/span>\r\nplot(tri_points(:,1),tri_points(:,2),<span class=\"string\">'LineWidth'<\/span>,2)\r\nhold <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_05.png\" alt=\"\"> <p>Now calculate the caliper angle so that we can visualize the parallel lines of support corresponding to the minimum diameter.<\/p><pre class=\"codeinput\">dx = tri_points(2,1) - tri_points(1,1);\r\ndy = tri_points(2,2) - tri_points(1,2);\r\nangle = atan2d(dy,dx);\r\n[x5,y5] = fullLine(gca,tri_points(1,:),angle);\r\n[x6,y6] = fullLine(gca,tri_points(3,:),angle);\r\n<\/pre><pre class=\"codeinput\">hold <span class=\"string\">on<\/span>\r\nplot(x5,y5,<span class=\"string\">'k'<\/span>)\r\nplot(x6,y6,<span class=\"string\">'k'<\/span>)\r\nhold <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_06.png\" alt=\"\"> <p>For next time, I'm tentatively planning to put together some of these concepts and use them to compute the minimum bounding box for an object.<\/p><pre class=\"codeinput\"><span class=\"keyword\">function<\/span> [x,y] = fullLine(ax,point,angle_degrees)\r\n<span class=\"comment\">% Steve Eddins<\/span>\r\n\r\n\r\nlimits = axis(ax);\r\nwidth = abs(limits(2) - limits(1));\r\nheight = abs(limits(4) - limits(3));\r\nd = 2*hypot(width,height);\r\nx1 = point(1) - d*cosd(angle_degrees);\r\nx2 = point(1) + d*cosd(angle_degrees);\r\ny1 = point(2) - d*sind(angle_degrees);\r\ny2 = point(2) + d*sind(angle_degrees);\r\nx = [x1 x2];\r\ny = [y1 y2];\r\n<span class=\"keyword\">end<\/span>\r\n\r\n<span class=\"keyword\">function<\/span> [d,triangle_points] = minFeretDiameter(V,antipodal_pairs)\r\n<span class=\"comment\">% Steve Eddins<\/span>\r\n\r\n\r\n<span class=\"keyword\">if<\/span> nargin &lt; 2\r\n    antipodal_pairs = antipodalPairs(V);\r\n<span class=\"keyword\">end<\/span>\r\n\r\nn = size(antipodal_pairs,1);\r\np = antipodal_pairs(:,1);\r\nq = antipodal_pairs(:,2);\r\n\r\nd = Inf;\r\ntriangle_points = [];\r\n\r\n<span class=\"keyword\">for<\/span> k = 1:n\r\n    <span class=\"keyword\">if<\/span> k == n\r\n        k1 = 1;\r\n    <span class=\"keyword\">else<\/span>\r\n        k1 = k+1;\r\n    <span class=\"keyword\">end<\/span>\r\n\r\n    pt1 = [];\r\n    pt2 = [];\r\n    pt3 = [];\r\n\r\n    <span class=\"keyword\">if<\/span> (p(k) ~= p(k1)) &amp;&amp; (q(k) == q(k1))\r\n        pt1 = V(p(k),:);\r\n        pt2 = V(p(k1),:);\r\n        pt3 = V(q(k),:);\r\n\r\n    <span class=\"keyword\">elseif<\/span> (p(k) == p(k1)) &amp;&amp; (q(k) ~= q(k1))\r\n        pt1 = V(q(k),:);\r\n        pt2 = V(q(k1),:);\r\n        pt3 = V(p(k),:);\r\n    <span class=\"keyword\">end<\/span>\r\n\r\n    <span class=\"keyword\">if<\/span> ~isempty(pt1)\r\n        <span class=\"comment\">% Points pt1, pt2, and pt3 form a possible minimum Feret diameter.<\/span>\r\n        <span class=\"comment\">% Points pt1 and pt2 form an edge parallel to caliper direction.<\/span>\r\n        <span class=\"comment\">% The Feret diameter orthogonal to the pt1-pt2 edge is the height<\/span>\r\n        <span class=\"comment\">% of the triangle with base pt1-pt2.<\/span>\r\n\r\n        d_k = triangleHeight(pt1,pt2,pt3);\r\n        <span class=\"keyword\">if<\/span> d_k &lt; d\r\n            d = d_k;\r\n            triangle_points = [pt1; pt2; pt3];\r\n        <span class=\"keyword\">end<\/span>\r\n    <span class=\"keyword\">end<\/span>\r\n<span class=\"keyword\">end<\/span>\r\n<span class=\"keyword\">end<\/span>\r\n<\/pre><script language=\"JavaScript\"> <!-- \r\n    function grabCode_83a9c73c5bf74fe384efcbc4e01ca0e4() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='83a9c73c5bf74fe384efcbc4e01ca0e4 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 83a9c73c5bf74fe384efcbc4e01ca0e4';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        copyright = 'Copyright 2018 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n\r\n        d.title = title + ' (MATLAB code)';\r\n        d.close();\r\n    }   \r\n     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\">Copyright 2017 The MathWorks, Inc.<br><a href=\"javascript:grabCode_83a9c73c5bf74fe384efcbc4e01ca0e4()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2017b<br><\/p><\/div><!--\r\n83a9c73c5bf74fe384efcbc4e01ca0e4 ##### SOURCE BEGIN #####\r\n%%\r\n% <https:\/\/blogs.mathworks.com\/steve\/2017\/10\/24\/feret-diameters-and-antipodal-vertices\/\r\n% Last time> (if you can remember that long ago), I talked about how to\r\n% find the maximum _Feret diameter_ of a shape. The Feret diameter,\r\n% sometimes called the _caliper diameter_, is illustrated by the diagram\r\n% below. In a virtual sense, place the object to be measured inside the\r\n% jaws of a caliper, with the caliper oriented at a specified angle. Close\r\n% the jaws tightly on the object while maintaining that angle. The distance\r\n% between the jaws is the Feret diameter at that angle.\r\n%\r\n% <<https:\/\/blogs.mathworks.com\/steve\/files\/caliper-dimensions.png>>\r\n%\r\n% In the last post, I demonstrated how to find all the _antipodal_ vertex\r\n% pairs of a shape, which is a useful step in finding the maximum Feret\r\n% diameters of a shape. \r\n%\r\n% Here is a convex shape with all of the antipodal vertex pairs shown.\r\n%\r\n% <<https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_2_04.png>>\r\n%\r\n% It turns out that the *minimum* Feret diameter can also be found by\r\n% looking at these antipodal pairs. Furthermore, it happens that the\r\n% minimum-distance Feret calipers touch the shape at *three* of these\r\n% vertices. I'm not going to try to prove that here, but let me illustrate\r\n% it with a couple of diagrams.\r\n%\r\n% Here is a shape with a couple of \"caliper lines\" drawn at -30 degrees.\r\n% (Note that the y-axis is reversed; that's why the angle is negative.)\r\n\r\n%%\r\nhull = [    \r\n    2.5000    5.5000\r\n    3.5000    4.5000\r\n    6.5000    2.5000\r\n    9.5000    1.5000\r\n   10.5000    1.5000\r\n   10.5000    3.5000\r\n    9.5000    5.5000\r\n    5.5000    7.5000\r\n    2.5000    7.5000\r\n    2.5000    5.5000  ];\r\n\r\nplot(hull(:,1),hull(:,2),'r','LineWidth',2)\r\naxis equal\r\naxis ij\r\naxis([0 15 0 10])\r\nhold on\r\nplot(hull(:,1),hull(:,2),'r*')\r\n[x1,y1] = fullLine(gca,[9.5 5.5],-30);\r\n[x2,y2] = fullLine(gca,[6.5 2.5],-30);\r\ncaliper_lines(1) = plot(x1,y1,'k');\r\ncaliper_lines(2) = plot(x2,y2,'k');\r\nhold off\r\n\r\n%%\r\n% You can always rotate these two caliper lines, by the same angle, until\r\n% at least one of them touches the *next* antipodal vertex. When you do\r\n% that rotation, the distance between the lines shrinks. \r\n\r\nset(caliper_lines,'Color',[0.8 0.8 0.8]);\r\n[x3,y3] = fullLine(gca,[9.5 5.5],thetad);\r\n[x4,y4] = fullLine(gca,[6.5 2.5],thetad);\r\nhold on\r\nplot(x3,y3,'k')\r\nplot(x4,y4,'k')\r\nhold off\r\n\r\n%%\r\n% The Feret diameter at that rotated angle, then, is the height of the\r\n% triangle formed by the three vertices, with the base of the triangle\r\n% defined by the two vertices touched by the same caliper line.\r\n\r\ndelete(caliper_lines);\r\nhold on\r\nplot([5.5 9.5 6.5 5.5],[7.5 5.5 2.5 7.5],'Color','b','LineWidth',2)\r\nhold off\r\n\r\n%%\r\n% The function |minFeretDiameter|, which appears at the end of this post,\r\n% simply walks around the set of adjacent-vertex triangles formed from\r\n% antipodal vertex pairs, looking for the triangle with the minimum height.\r\n%\r\n% Let's look for the minimum Feret diameter in a slightly more interesting\r\n% shape.\r\nload shape\r\nplot(bx,by,'LineWidth',1)\r\naxis equal\r\naxis ij\r\naxis([0 650 0 650])\r\n\r\n%%\r\n% Find the convex hull, making sure to simplify it, and then find the\r\n% antipodal pairs. (I showed the function |antipodalPairs| in my previous\r\n% post.)\r\n\r\nhull = convhull(bx,by,'Simplify',true);\r\nS = [bx(hull) by(hull)];\r\npairs = antipodalPairs(S);\r\n\r\n%%\r\n% Now we can call |minFeretDiameter|.\r\n\r\n[d,tri_points] = minFeretDiameter(S,pairs)\r\n\r\n%%\r\n% Superimpose the minimum-height triangle that |minFeretDiameter| found.\r\n\r\ntri_points = [tri_points; tri_points(1,:)];\r\nhold on\r\nplot(tri_points(:,1),tri_points(:,2),'LineWidth',2)\r\nhold off\r\n\r\n%%\r\n% Now calculate the caliper angle so that we can visualize the parallel\r\n% lines of support corresponding to the minimum diameter.\r\n\r\ndx = tri_points(2,1) - tri_points(1,1);\r\ndy = tri_points(2,2) - tri_points(1,2);\r\nangle = atan2d(dy,dx);\r\n[x5,y5] = fullLine(gca,tri_points(1,:),angle);\r\n[x6,y6] = fullLine(gca,tri_points(3,:),angle);\r\n\r\n%%\r\nhold on\r\nplot(x5,y5,'k')\r\nplot(x6,y6,'k')\r\nhold off\r\n\r\n%%\r\n% For next time, I'm tentatively planning to put together some of these\r\n% concepts and use them to compute the minimum bounding box for an object.\r\n\r\n%%\r\nfunction [x,y] = fullLine(ax,point,angle_degrees)\r\n% Steve Eddins\r\n% Copyright 2017 The MathWorks, Inc.\r\n\r\nlimits = axis(ax);\r\nwidth = abs(limits(2) - limits(1));\r\nheight = abs(limits(4) - limits(3));\r\nd = 2*hypot(width,height);\r\nx1 = point(1) - d*cosd(angle_degrees);\r\nx2 = point(1) + d*cosd(angle_degrees);\r\ny1 = point(2) - d*sind(angle_degrees);\r\ny2 = point(2) + d*sind(angle_degrees);\r\nx = [x1 x2];\r\ny = [y1 y2];\r\nend\r\n\r\nfunction [d,triangle_points] = minFeretDiameter(V,antipodal_pairs)\r\n% Steve Eddins\r\n% Copyright 2017-2018 The MathWorks, Inc.\r\n\r\nif nargin < 2\r\n    antipodal_pairs = antipodalPairs(V);\r\nend\r\n\r\nn = size(antipodal_pairs,1);\r\np = antipodal_pairs(:,1);\r\nq = antipodal_pairs(:,2);\r\n\r\nd = Inf;\r\ntriangle_points = [];\r\n\r\nfor k = 1:n\r\n    if k == n\r\n        k1 = 1;\r\n    else\r\n        k1 = k+1;\r\n    end\r\n    \r\n    pt1 = [];\r\n    pt2 = [];\r\n    pt3 = [];\r\n    \r\n    if (p(k) ~= p(k1)) && (q(k) == q(k1))\r\n        pt1 = V(p(k),:);\r\n        pt2 = V(p(k1),:);\r\n        pt3 = V(q(k),:);\r\n        \r\n    elseif (p(k) == p(k1)) && (q(k) ~= q(k1))\r\n        pt1 = V(q(k),:);\r\n        pt2 = V(q(k1),:);\r\n        pt3 = V(p(k),:);\r\n    end\r\n    \r\n    if ~isempty(pt1)\r\n        % Points pt1, pt2, and pt3 form a possible minimum Feret diameter.\r\n        % Points pt1 and pt2 form an edge parallel to caliper direction.\r\n        % The Feret diameter orthogonal to the pt1-pt2 edge is the height\r\n        % of the triangle with base pt1-pt2.\r\n        \r\n        d_k = triangleHeight(pt1,pt2,pt3);\r\n        if d_k < d\r\n            d = d_k;\r\n            triangle_points = [pt1; pt2; pt3];\r\n        end\r\n    end\r\nend\r\nend     \r\n##### SOURCE END ##### 83a9c73c5bf74fe384efcbc4e01ca0e4\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/steve\/files\/feret_diameter_3_06.png\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" \/><\/div><!--introduction--><p><a href=\"https:\/\/blogs.mathworks.com\/steve\/2017\/10\/24\/feret-diameters-and-antipodal-vertices\/\">Last time<\/a> (if you can remember that long ago), I talked about how to find the maximum <i>Feret diameter<\/i> of a shape. The Feret diameter, sometimes called the <i>caliper diameter<\/i>, is illustrated by the diagram below. In a virtual sense, place the object to be measured inside the jaws of a caliper, with the caliper oriented at a specified angle. Close the jaws tightly on the object while maintaining that angle. The distance between the jaws is the Feret diameter at that angle.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/steve\/2018\/02\/20\/minimum-feret-diameter\/\">read more >><\/a><\/p>","protected":false},"author":42,"featured_media":2802,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[208,1209,50,835,1207,733,90,334,472,362,68,1211,190],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/2788"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/comments?post=2788"}],"version-history":[{"count":3,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/2788\/revisions"}],"predecessor-version":[{"id":2808,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/2788\/revisions\/2808"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/media\/2802"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/media?parent=2788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/categories?post=2788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/tags?post=2788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}