{"id":4180,"date":"2018-11-26T13:48:34","date_gmt":"2018-11-26T18:48:34","guid":{"rendered":"https:\/\/blogs.mathworks.com\/cleve\/?p=4180"},"modified":"2018-11-26T13:48:34","modified_gmt":"2018-11-26T18:48:34","slug":"penrose-and-fourier-design-playing-cards","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/cleve\/2018\/11\/26\/penrose-and-fourier-design-playing-cards\/","title":{"rendered":"Penrose and Fourier Design Playing Cards"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p>MathWorks is creating a deck of playing cards that will be offered as gifts at our trade show booths.  The design of the cards is based on Penrose Tilings and plots of the Finite Fourier Transform Matrix.<\/p><!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#eb57efec-f743-48b2-a0a7-2d724f41f6b9\">Penrose Tilings<\/a><\/li><li><a href=\"#f9776f46-902f-4a52-b58c-1bd64ab1c1fc\">The Suits<\/a><\/li><li><a href=\"#8ef6e96c-de1e-4d82-b25d-94fccb3cb9b4\">The Face Cards<\/a><\/li><li><a href=\"#8f5f4c0f-4be3-4007-823c-ad9bd053d3a0\">The Back<\/a><\/li><li><a href=\"#ccd8e258-b46d-4b79-83d9-10a57f934e24\">Cleve's Lab<\/a><\/li><li><a href=\"#228066da-cf88-4eef-a1d5-f8ed49e2618e\">Penrose Rhombus Tiling<\/a><\/li><li><a href=\"#b25ce138-b314-4bca-a0ce-1c76e3ec36ce\">Four Types of Triangles<\/a><\/li><li><a href=\"#f5742f4a-874b-4d53-84a2-40412107eb20\">Triangle Functions and Triangle Representation<\/a><\/li><li><a href=\"#6741598c-d7c2-4ef0-a8c4-5e8bec802840\">Triangle Side Labels<\/a><\/li><li><a href=\"#66a45907-62e9-48af-86f6-9dd22ae33ceb\">Making the Two Types of Rhombus<\/a><\/li><li><a href=\"#7fdc3485-b1cd-430f-929d-067129fdf637\">Triangle Decomposition<\/a><\/li><li><a href=\"#18f8f040-7989-4a7c-9384-d86a26d9f8e4\">From Triangles to Rhombuses<\/a><\/li><li><a href=\"#0fb0a781-ce8d-450e-8f58-963e03425bd5\">Starting from Multiple Triangles<\/a><\/li><\/ul><\/div><h4>Penrose Tilings<a name=\"eb57efec-f743-48b2-a0a7-2d724f41f6b9\"><\/a><\/h4><p>This is an example of a Penrose tiling.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/PRT.png\" alt=\"\"> <\/p><p>Penrose tilings are aperiodic tilings of the plane named after Oxford emeritus physicist Roger Penrose, who studied them in the 1970s. MathWorks' Steve Eddins has written a paper about his MATLAB program for generating Penrose tilings. I will include the paper in this blog post. Steve has also submitted his paper and code to the MATLAB Central File Exchange, <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/69490-penrose-rhombus-tiling\">Penrose Rhombus Tiling<\/a>.<\/p><h4>The Suits<a name=\"f9776f46-902f-4a52-b58c-1bd64ab1c1fc\"><\/a><\/h4><p>Look carefully at the example tiling.  It's made entirely from two rhombuses, one colored gold and one colored blue. Each rhombus, in turn, is made from two isosceles triangles. These shapes inspired MathWorks designer Gabby Lydon to reimagine the traditional symbols for the four suits in a deck of cards.<\/p><p>Here are the diamonds and hearts.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/ADH.png\" alt=\"\"> <\/p><p>Here are the clubs and spades.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/ACS.png\" alt=\"\"> <\/p><h4>The Face Cards<a name=\"8ef6e96c-de1e-4d82-b25d-94fccb3cb9b4\"><\/a><\/h4><p>The theme of triangles and rhombuses is continued in the face cards.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/JQC.png\" alt=\"\"> <\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/KC.png\" alt=\"\"> <\/p><h4>The Back<a name=\"8f5f4c0f-4be3-4007-823c-ad9bd053d3a0\"><\/a><\/h4><p>The backs of the cards feature two mathematical objects that I have described in this blog.  I wrote a five-part series about our logo five years ago, beginning with <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2014\/10\/13\/mathworks-logo-part-one-why-is-it-l-shaped\/\">part one<\/a>.  And, I wrote about the graphic produced by the <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2014\/09\/29\/finite-fourier-transform-matrix\/\">Finite Fourier Transform matrix<\/a>.<\/p><p>Start with a prime integer.<\/p><pre class=\"codeinput\">   n = 31;\r\n<\/pre><p>Take a Fourier transform of the columns of the identity matrix.<\/p><pre class=\"codeinput\">   F = fft(eye(n,n));\r\n<\/pre><p>Plot it.  Because 31 is prime, this is the complete graph on 31 points. Every point on the circumference is connected to every other point.<\/p><pre class=\"codeinput\">   p = plot(F);\r\n   axis <span class=\"string\">square<\/span>\r\n   axis <span class=\"string\">off<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_01.png\" alt=\"\"> <p>That's too colorful.<\/p><pre class=\"codeinput\">   color = get(gca,<span class=\"string\">'colororder'<\/span>);\r\n   set(p,<span class=\"string\">'color'<\/span>,color(1,:))\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_02.png\" alt=\"\"> <p>Now graphic design software takes over and makes room for the logo.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/Back.png\" alt=\"\"> <\/p><h4>Cleve's Lab<a name=\"ccd8e258-b46d-4b79-83d9-10a57f934e24\"><\/a><\/h4><p>All this has reminded me of two FFT-related apps from <i>Numerical Computing with MATLAB<\/i>, <tt>fftgui<\/tt> and <tt>fftmatrix<\/tt>. I've added them to Cleve's Laboratory with <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/59085-cleve-laboratory\">Version 3.9<\/a>.  This is the image from <tt>fftmatrix<\/tt> for n = 12.  Because 12 is not prime, this is not a completely connected graph.  You can vary both the matrix order and the columns to be transformed.<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/fftmatrix.jpg\" alt=\"\"> <\/p><p>Now, here is Steve's paper about Penrose tiling.<\/p><h4>Penrose Rhombus Tiling<a name=\"228066da-cf88-4eef-a1d5-f8ed49e2618e\"><\/a><\/h4><p><b>by Steve Eddins<\/b><\/p><p>This story is about creating planar tilings like this:<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose-screen-shot.png\" alt=\"\"> <\/p><p>This is an example of a Penrose tiling. Penrose tilings are aperiodic tilings that named after Roger Penrose, who studied them in the 1970s. This particular form, made from two rhombuses, is called a <i>P3 tiling<\/i>.<\/p><h4>Four Types of Triangles<a name=\"b25ce138-b314-4bca-a0ce-1c76e3ec36ce\"><\/a><\/h4><p>Construction of a Penrose P3 tiling is based on 4 types of isosceles triangles. The types are labeled A, A', B, and B'. The A and A' triangles have an apex angle of 36 degrees, and the B and B' triangles have an apex angle of 72 degrees.<\/p><pre class=\"codeinput\">subplot(2,2,1)\r\nshowLabeledTriangles(aTriangle([],-1,1))\r\n\r\nsubplot(2,2,2)\r\nshowLabeledTriangles(apTriangle([],-1,1))\r\n\r\nsubplot(2,2,3)\r\nshowLabeledTriangles(bTriangle([],-1,1))\r\n\r\nsubplot(2,2,4)\r\nshowLabeledTriangles(bpTriangle([],-1,1))\r\n<\/pre><pre class=\"codeoutput\">vertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 0.7265i   1.0000 + 0.0000i\r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 0.7265i   1.0000 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_03.png\" alt=\"\"> <h4>Triangle Functions and Triangle Representation<a name=\"f5742f4a-874b-4d53-84a2-40412107eb20\"><\/a><\/h4><p>Before proceeding further, let's pause to look at what the functions <tt>aTriangle<\/tt>, <tt>apTriangle<\/tt>, <tt>bTriangle<\/tt>, and <tt>bpTriangle<\/tt> do.<\/p><p>The function <tt>aTriangle<\/tt> takes three arguments: <tt>aTriangle(apex,left,right)<\/tt>. Each of the three arguments is a point in the complex plane that represents one triangle vertex. You specify any two points, passing in the third point as <tt>[]<\/tt>, and <tt>aTriangle<\/tt> computes the missing vertex for you. Here's an example showing how to compute a type A triangle whose base is on the real axis, extending from -1 to 1.<\/p><pre class=\"codeinput\">t_a = aTriangle([],-1,1)\r\n<\/pre><pre class=\"codeoutput\">t_a =\r\n  1&times;4 table\r\n      Apex       Left    Right    Type\r\n    _________    ____    _____    ____\r\n    0+3.0777i     -1       1       A  \r\n<\/pre><p>The result is returned as a table, which is convenient because we'll be creating large collections of these triangles, and it is helpful to be able to refer to the different vertices of the triangles using the notation <tt>t.Apex<\/tt>, <tt>t.Left<\/tt>, and <tt>t.Right<\/tt>.<\/p><p>The function <tt>showLabeledTriangles<\/tt> takes a table of triangles and displays them all, with the triangle types and their sides labeled. (We'll talk more about the labeling of the sides below.)<\/p><pre class=\"codeinput\">t_b = bTriangle(t_a.Apex,t_a.Right,[]);\r\nT = [t_a ; t_b]\r\nclf\r\nshowLabeledTriangles(T)\r\n<\/pre><pre class=\"codeoutput\">T =\r\n  2&times;4 table\r\n      Apex       Left        Right        Type\r\n    _________    ____    _____________    ____\r\n    0+3.0777i     -1         1+0i          A  \r\n    0+3.0777i      1     2.618+4.9798i     B  \r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\n   1.0000 + 0.0000i   0.0000 + 3.0777i   2.6180 + 4.9798i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_04.png\" alt=\"\"> <h4>Triangle Side Labels<a name=\"6741598c-d7c2-4ef0-a8c4-5e8bec802840\"><\/a><\/h4><p>The markers on the sides of the triangles help us to distinguish between A and A' triangles, as well as between B and B' triangles. For example, an A triangle has the circle marker on the left side (assuming the apex is oriented at the top), whereas the A' triangle has the circle marker on the right side.<\/p><p>The side labels also help us confirm whether we have a correct arrangement of triangles in our Penrose tiling. Triangles are only allowed to share an edge in the Penrose P3 tiling if the side markers align together and are the same. For example, in the two triangles shown above, the square marker on the right edge of the triangle lines up with the square marker on the left edge of the B triangle. If we had used a B' triangle instead, the markers would not have been identical.<\/p><pre class=\"codeinput\">t_bp = bpTriangle(t_a.Apex,t_a.Right,[]);\r\nT = [t_a ; t_bp];\r\nshowLabeledTriangles(T)\r\n<\/pre><pre class=\"codeoutput\">vertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\n   1.0000 + 0.0000i   0.0000 + 3.0777i   2.6180 + 4.9798i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_05.png\" alt=\"\"> <h4>Making the Two Types of Rhombus<a name=\"66a45907-62e9-48af-86f6-9dd22ae33ceb\"><\/a><\/h4><p>In the Penrose P3 tiling, one rhombus is made from an A and an A' triangle, and the other is made from a B and a B' triangle.<\/p><pre class=\"codeinput\">subplot(1,2,1)\r\nr1 = [ <span class=\"keyword\">...<\/span>\r\n    aTriangle([],-1,1)\r\n    apTriangle([],1,-1)];\r\nshowLabeledTriangles(r1)\r\n\r\nsubplot(1,2,2)\r\nr2 = [ <span class=\"keyword\">...<\/span>\r\n    bTriangle([],-1,1)\r\n    bpTriangle([],1,-1)];\r\nshowLabeledTriangles(r2)\r\n<\/pre><pre class=\"codeoutput\">vertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\n   1.0000 + 0.0000i   0.0000 - 3.0777i  -1.0000 + 0.0000i\r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 0.7265i   1.0000 + 0.0000i\r\n   1.0000 + 0.0000i   0.0000 - 0.7265i  -1.0000 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_06.png\" alt=\"\"> <h4>Triangle Decomposition<a name=\"7fdc3485-b1cd-430f-929d-067129fdf637\"><\/a><\/h4><p>Construction of the P3 tiling proceeds by starting with one triangle and then successively decomposing it. Each of the four types of triangles has a different rule for decomposition.<\/p><p>An A triangle decomposes into an A triangle and a B' triangle.<\/p><pre class=\"codeinput\">t_a = aTriangle([],-1,1);\r\nt_a_d = decomposeATriangle(t_a)\r\n\r\nclf\r\nsubplot(1,2,1)\r\nshowLabeledTriangles(t_a)\r\nlims = axis;\r\nsubplot(1,2,2)\r\nshowLabeledTriangles(t_a_d)\r\naxis(lims)\r\n<\/pre><pre class=\"codeoutput\">t_a_d =\r\n  2&times;4 table\r\n         Apex            Left            Right         Type\r\n    _______________    _________    _______________    ____\r\n         -1+0i         1+0i         0.61803+1.1756i     A  \r\n    0.61803+1.1756i    0+3.0777i         -1+0i          Bp \r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\nvertices =\r\n   1.0000 + 0.0000i  -1.0000 + 0.0000i   0.6180 + 1.1756i\r\n   0.0000 + 3.0777i   0.6180 + 1.1756i  -1.0000 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_07.png\" alt=\"\"> <p>You can look at the very short implementation of <tt>decomposeATriangle<\/tt> to see how this is done.<\/p><pre class=\"language-matlab\"><span class=\"keyword\">function<\/span> out = decomposeATriangle(in)\r\n<\/pre><pre class=\"language-matlab\">out = [ <span class=\"keyword\">...<\/span>\r\n    aTriangle(in.Left,in.Right,[])\r\n    bpTriangle([],in.Apex,in.Left) ];\r\n<\/pre><p>The smaller A triangle is determined by placing its apex at the left vertex of the input triangle and placing its left vertex at the right vertex of the input triangle.<\/p><p>The smaller B' triangle is determined by placing its left vertex at the apex of the input triangle and placing its right vertex at the left vertex of the input triangle.<\/p><p>There are similar rules for decomposing the other three types of triangles.<\/p><pre class=\"codeinput\">t_ap = apTriangle([],-1,1);\r\nt_ap_d = decomposeApTriangle(t_ap)\r\n\r\nclf\r\nsubplot(1,2,1)\r\nshowLabeledTriangles(t_ap)\r\nlims = axis;\r\nsubplot(1,2,2)\r\nshowLabeledTriangles(t_ap_d)\r\naxis(lims)\r\n<\/pre><pre class=\"codeoutput\">t_ap_d =\r\n  2&times;4 table\r\n          Apex                Left            Right       Type\r\n    ________________    ________________    __________    ____\r\n           1+0i         -0.61803+1.1756i    -1+0i          Ap \r\n    -0.61803+1.1756i           1+0i          0+3.0777i     B  \r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 3.0777i   1.0000 + 0.0000i\r\nvertices =\r\n  -0.6180 + 1.1756i   1.0000 + 0.0000i  -1.0000 + 0.0000i\r\n   1.0000 + 0.0000i  -0.6180 + 1.1756i   0.0000 + 3.0777i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_08.png\" alt=\"\"> <pre class=\"codeinput\">t_b = bTriangle([],-1,1);\r\nt_b_d = decomposeBTriangle(t_b)\r\n\r\nclf\r\nsubplot(2,1,1)\r\nshowLabeledTriangles(t_b)\r\nlims = axis;\r\nsubplot(2,1,2)\r\nshowLabeledTriangles(t_b_d)\r\naxis(lims)\r\n<\/pre><pre class=\"codeoutput\">t_b_d =\r\n  3&times;4 table\r\n          Apex              Left              Right          Type\r\n    _________________    ___________    _________________    ____\r\n     0.23607+0i           1+0i                 0+0.72654i     B  \r\n     0.23607+0i           0+0.72654i    -0.38197+0.44903i     A  \r\n    -0.38197+0.44903i    -1+0i           0.23607+0i           Bp \r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 0.7265i   1.0000 + 0.0000i\r\nvertices =\r\n   1.0000 + 0.0000i   0.2361 + 0.0000i   0.0000 + 0.7265i\r\n   0.0000 + 0.7265i   0.2361 + 0.0000i  -0.3820 + 0.4490i\r\n  -1.0000 + 0.0000i  -0.3820 + 0.4490i   0.2361 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_09.png\" alt=\"\"> <pre class=\"codeinput\">t_bp = bpTriangle([],-1,1);\r\nt_bp_d = decomposeBpTriangle(t_bp)\r\n\r\nclf\r\nsubplot(2,1,1)\r\nshowLabeledTriangles(t_bp)\r\nlims = axis;\r\nsubplot(2,1,2)\r\nshowLabeledTriangles(t_bp_d)\r\naxis(lims)\r\n<\/pre><pre class=\"codeoutput\">t_bp_d =\r\n  3&times;4 table\r\n          Apex                 Left              Right       Type\r\n    _________________    _________________    ___________    ____\r\n    -0.23607+0i                 0+0.72654i    -1+0i           Bp \r\n    -0.23607+0i           0.38197+0.44903i     0+0.72654i     Ap \r\n     0.38197+0.44903i    -0.23607+0i           1+0i           B  \r\nvertices =\r\n  -1.0000 + 0.0000i   0.0000 + 0.7265i   1.0000 + 0.0000i\r\nvertices =\r\n   0.0000 + 0.7265i  -0.2361 + 0.0000i  -1.0000 + 0.0000i\r\n   0.3820 + 0.4490i  -0.2361 + 0.0000i   0.0000 + 0.7265i\r\n  -0.2361 + 0.0000i   0.3820 + 0.4490i   1.0000 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_10.png\" alt=\"\"> <h4>From Triangles to Rhombuses<a name=\"18f8f040-7989-4a7c-9384-d86a26d9f8e4\"><\/a><\/h4><p>Let's start with a B triangle and decompose it three times successively.<\/p><pre class=\"codeinput\">t = bTriangle([],-1,1);\r\nt = decomposeTriangles(t)\r\nt = decomposeTriangles(t)\r\nt = decomposeTriangles(t)\r\n<\/pre><pre class=\"codeoutput\">t =\r\n  3&times;4 table\r\n          Apex              Left              Right          Type\r\n    _________________    ___________    _________________    ____\r\n     0.23607+0i           1+0i                 0+0.72654i     B  \r\n     0.23607+0i           0+0.72654i    -0.38197+0.44903i     A  \r\n    -0.38197+0.44903i    -1+0i           0.23607+0i           Bp \r\nt =\r\n  8&times;4 table\r\n          Apex                 Left                 Right          Type\r\n    _________________    _________________    _________________    ____\r\n     0.38197+0.44903i           0+0.72654i     0.23607+0i           B  \r\n     0.38197+0.44903i     0.23607+0i           0.52786+0i           A  \r\n     0.52786+0i                 1+0i           0.38197+0.44903i     Bp \r\n           0+0.72654i    -0.38197+0.44903i     -0.1459+0.27751i     A  \r\n     -0.1459+0.27751i     0.23607+0i                 0+0.72654i     Bp \r\n    -0.52786+0i          -0.38197+0.44903i          -1+0i           Bp \r\n    -0.52786+0i           -0.1459+0.27751i    -0.38197+0.44903i     Ap \r\n     -0.1459+0.27751i    -0.52786+0i           0.23607+0i           B  \r\nt =\r\n  21&times;4 table\r\n           Apex                 Left                 Right           Type\r\n    __________________    _________________    __________________    ____\r\n       0.1459+0.27751i     0.23607+0i            0.38197+0.44903i     B  \r\n       0.1459+0.27751i     0.38197+0.44903i      0.23607+0.55503i     A  \r\n      0.23607+0.55503i           0+0.72654i       0.1459+0.27751i     Bp \r\n      0.23607+0i           0.52786+0i            0.47214+0.17151i     A  \r\n      0.47214+0.17151i     0.38197+0.44903i      0.23607+0i           Bp \r\n      0.76393+0.17151i     0.52786+0i                  1+0i           Bp \r\n      0.76393+0.17151i     0.47214+0.17151i      0.52786+0i           Ap \r\n      0.47214+0.17151i     0.76393+0.17151i      0.38197+0.44903i     B  \r\n     -0.38197+0.44903i     -0.1459+0.27751i     -0.09017+0.44903i     A  \r\n     -0.09017+0.44903i           0+0.72654i     -0.38197+0.44903i     Bp \r\n       0.1459+0.27751i     -0.1459+0.27751i      0.23607+0i           Bp \r\n       0.1459+0.27751i    -0.09017+0.44903i      -0.1459+0.27751i     Ap \r\n     -0.09017+0.44903i      0.1459+0.27751i            0+0.72654i     B  \r\n     -0.61803+0.27751i    -0.52786+0i           -0.38197+0.44903i     Bp \r\n     -0.61803+0.27751i     -0.7082+0i           -0.52786+0i           Ap \r\n      -0.7082+0i          -0.61803+0.27751i           -1+0i           B  \r\n     -0.38197+0.44903i     -0.2918+0.17151i      -0.1459+0.27751i     Ap \r\n      -0.2918+0.17151i    -0.38197+0.44903i     -0.52786+0i           B  \r\n    -0.055728+0i           0.23607+0i            -0.1459+0.27751i     B  \r\n    -0.055728+0i           -0.1459+0.27751i      -0.2918+0.17151i     A  \r\n      -0.2918+0.17151i    -0.52786+0i          -0.055728+0i           Bp \r\n<\/pre><pre class=\"codeinput\">clf\r\nshowLabeledTriangles(t)\r\n<\/pre><pre class=\"codeoutput\">vertices =\r\n   0.2361 + 0.0000i   0.1459 + 0.2775i   0.3820 + 0.4490i\r\n   0.3820 + 0.4490i   0.1459 + 0.2775i   0.2361 + 0.5550i\r\n   0.0000 + 0.7265i   0.2361 + 0.5550i   0.1459 + 0.2775i\r\n   0.5279 + 0.0000i   0.2361 + 0.0000i   0.4721 + 0.1715i\r\n   0.3820 + 0.4490i   0.4721 + 0.1715i   0.2361 + 0.0000i\r\n   0.5279 + 0.0000i   0.7639 + 0.1715i   1.0000 + 0.0000i\r\n   0.4721 + 0.1715i   0.7639 + 0.1715i   0.5279 + 0.0000i\r\n   0.7639 + 0.1715i   0.4721 + 0.1715i   0.3820 + 0.4490i\r\n  -0.1459 + 0.2775i  -0.3820 + 0.4490i  -0.0902 + 0.4490i\r\n   0.0000 + 0.7265i  -0.0902 + 0.4490i  -0.3820 + 0.4490i\r\n  -0.1459 + 0.2775i   0.1459 + 0.2775i   0.2361 + 0.0000i\r\n  -0.0902 + 0.4490i   0.1459 + 0.2775i  -0.1459 + 0.2775i\r\n   0.1459 + 0.2775i  -0.0902 + 0.4490i   0.0000 + 0.7265i\r\n  -0.5279 + 0.0000i  -0.6180 + 0.2775i  -0.3820 + 0.4490i\r\n  -0.7082 + 0.0000i  -0.6180 + 0.2775i  -0.5279 + 0.0000i\r\n  -0.6180 + 0.2775i  -0.7082 + 0.0000i  -1.0000 + 0.0000i\r\n  -0.2918 + 0.1715i  -0.3820 + 0.4490i  -0.1459 + 0.2775i\r\n  -0.3820 + 0.4490i  -0.2918 + 0.1715i  -0.5279 + 0.0000i\r\n   0.2361 + 0.0000i  -0.0557 + 0.0000i  -0.1459 + 0.2775i\r\n  -0.1459 + 0.2775i  -0.0557 + 0.0000i  -0.2918 + 0.1715i\r\n  -0.5279 + 0.0000i  -0.2918 + 0.1715i  -0.0557 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_11.png\" alt=\"\"> <p>Now the labels are getting in the way.<\/p><pre class=\"codeinput\">showTriangles(t)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_12.png\" alt=\"\"> <p>That's better, but it's hard to visualize the rhombuses because the triangle bases are being drawn. Let's switch to a different visualization function that draws the rhombuses with colored shading and without the triangle bases.<\/p><pre class=\"codeinput\">showTiles(t)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_13.png\" alt=\"\"> <p>Let's do five more levels of decomposition.<\/p><pre class=\"codeinput\"><span class=\"keyword\">for<\/span> k = 1:5\r\n    t = decomposeTriangles(t);\r\n<span class=\"keyword\">end<\/span>\r\n\r\nnum_triangles = height(t)\r\n<\/pre><pre class=\"codeoutput\">num_triangles =\r\n        2584\r\n<\/pre><p>Now we have lots of triangles. Let's take a look.<\/p><pre class=\"codeinput\">clf\r\nshowTiles(t)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_14.png\" alt=\"\"> <p>Zoom in.<\/p><pre class=\"codeinput\">axis([-0.3 0.2 0.1 0.5])\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_15.png\" alt=\"\"> <p>For fun, you can add to the visualization by inserting arcs or other shapes in the triangles. You just need to make everything match up across the different types of triangles. The <tt>showDecoratedTiles<\/tt> function shows one possible variation.<\/p><pre class=\"codeinput\">clf\r\nshowDecoratedTiles(t)\r\naxis([-0.2 0.1 0.2 0.4])\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_16.png\" alt=\"\"> <h4>Starting from Multiple Triangles<a name=\"0fb0a781-ce8d-450e-8f58-963e03425bd5\"><\/a><\/h4><p>Another interesting thing to try is to start from a pattern of multiple triangles instead of just one. You just to arrange the initial triangles so that they satisfy the side matching rules. Let's use a circular pattern of alternating A and A' triangles sharing a common apex.<\/p><pre class=\"codeinput\">t = table;\r\n<span class=\"keyword\">for<\/span> k = 1:5\r\n    thetad = 72*(k-1);\r\n    t_a = aTriangle(0,cosd(thetad) + 1i*sind(thetad),[]);\r\n    t_ap = apTriangle(0,t_a.Right,[]);\r\n    t = [t ; t_a ; t_ap];\r\n<span class=\"keyword\">end<\/span>\r\nshowLabeledTriangles(t)\r\n<\/pre><pre class=\"codeoutput\">vertices =\r\n   1.0000 + 0.0000i   0.0000 + 0.0000i   0.8090 + 0.5878i\r\n   0.8090 + 0.5878i   0.0000 + 0.0000i   0.3090 + 0.9511i\r\n   0.3090 + 0.9511i   0.0000 + 0.0000i  -0.3090 + 0.9511i\r\n  -0.3090 + 0.9511i   0.0000 + 0.0000i  -0.8090 + 0.5878i\r\n  -0.8090 + 0.5878i   0.0000 + 0.0000i  -1.0000 + 0.0000i\r\n  -1.0000 + 0.0000i   0.0000 + 0.0000i  -0.8090 - 0.5878i\r\n  -0.8090 - 0.5878i   0.0000 + 0.0000i  -0.3090 - 0.9511i\r\n  -0.3090 - 0.9511i   0.0000 + 0.0000i   0.3090 - 0.9511i\r\n   0.3090 - 0.9511i   0.0000 + 0.0000i   0.8090 - 0.5878i\r\n   0.8090 - 0.5878i   0.0000 + 0.0000i   1.0000 + 0.0000i\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_17.png\" alt=\"\"> <pre class=\"codeinput\">t2 = t;\r\n<span class=\"keyword\">for<\/span> k = 1:4\r\n    t2 = decomposeTriangles(t2);\r\n<span class=\"keyword\">end<\/span>\r\nclf\r\nshowDecoratedTiles(t2)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/penrose_blog_18.png\" alt=\"\"> <script language=\"JavaScript\"> <!-- \r\n    function grabCode_e64859885cfb4052859263239595e0e9() {\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='e64859885cfb4052859263239595e0e9 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' e64859885cfb4052859263239595e0e9';\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\"><br><a href=\"javascript:grabCode_e64859885cfb4052859263239595e0e9()\"><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; R2018a<br><\/p><\/div><!--\r\ne64859885cfb4052859263239595e0e9 ##### SOURCE BEGIN #####\r\n%% Penrose and Fourier Design Playing Cards\r\n% MathWorks is creating a deck of playing cards that will be offered\r\n% as gifts at our trade show booths.  The design of the cards is\r\n% based on Penrose Tilings and plots of the Finite Fourier Transform\r\n% Matrix.\r\n\r\n%% Penrose Tilings\r\n% This is an example of a Penrose tiling. \r\n%\r\n% <<PRT.png>>\r\n%\r\n% Penrose tilings are aperiodic tilings of the plane named after\r\n% Oxford emeritus physicist Roger Penrose, who studied them in the 1970s.\r\n% MathWorks' Steve Eddins has written a paper about his MATLAB\r\n% program for generating Penrose tilings.\r\n% I will include the paper in this blog post.\r\n% Steve has also submitted his paper and code to the\r\n% MATLAB Central File Exchange,\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/69490-penrose-rhombus-tiling\r\n% Penrose Rhombus Tiling>.\r\n\r\n%% The Suits\r\n% Look carefully at the example tiling.  It's made entirely from\r\n% two rhombuses, one colored gold and one colored blue.\r\n% Each rhombus, in turn, is made from two isosceles triangles.\r\n% These shapes inspired MathWorks designer Gabby Lydon\r\n% to reimagine the traditional symbols for the four suits in a\r\n% deck of cards.\r\n\r\n%% \r\n% Here are the diamonds and hearts.\r\n%\r\n% <<ADH.png>>\r\n\r\n%%\r\n% Here are the clubs and spades.\r\n%\r\n% <<ACS.png>>\r\n\r\n%% The Face Cards\r\n% The theme of triangles and rhombuses is continued in the face cards.\r\n%\r\n% <<JQC.png>>\r\n%\r\n% <<KC.png>>\r\n%\r\n\r\n%% The Back\r\n% The backs of the cards feature two mathematical objects that I have\r\n% described in this blog.  I wrote a five-part series about our logo\r\n% five years ago, beginning with\r\n% <https:\/\/blogs.mathworks.com\/cleve\/2014\/10\/13\/mathworks-logo-part-one-why-is-it-l-shaped\/\r\n% part one>.  And, I wrote about the graphic produced by the \r\n% <https:\/\/blogs.mathworks.com\/cleve\/2014\/09\/29\/finite-fourier-transform-matrix\/\r\n% Finite Fourier Transform matrix>.\r\n\r\n%%\r\n% Start with a prime integer.\r\n\r\n   n = 31;\r\n   \r\n%%\r\n% Take a Fourier transform of the columns of the identity matrix.\r\n\r\n   F = fft(eye(n,n));\r\n   \r\n%%\r\n% Plot it.  Because 31 is prime, this is the complete graph on 31 points.\r\n% Every point on the circumference is connected to every other point.\r\n\r\n   p = plot(F);\r\n   axis square\r\n   axis off\r\n  \r\n%%\r\n% That's too colorful.\r\n\r\n   color = get(gca,'colororder');\r\n   set(p,'color',color(1,:))\r\n\r\n%%\r\n% Now graphic design software takes over and makes room for the logo.\r\n%\r\n% <<Back.png>>\r\n\r\n%% Cleve's Lab\r\n% All this has reminded me of two FFT-related apps from _Numerical\r\n% Computing with MATLAB_, |fftgui| and |fftmatrix|.\r\n% I've added them to Cleve's Laboratory with\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/59085-cleve-laboratory\r\n% Version 3.9>.  This is the image from |fftmatrix| for n = 12.  Because\r\n% 12 is not prime, this is not a completely connected graph.  You can\r\n% vary both the matrix order and the columns to be transformed. \r\n%\r\n% <<fftmatrix.jpg>>\r\n\r\n%%\r\n% Now, here is Steve's paper about Penrose tiling.\r\n\r\n%% Penrose Rhombus Tiling\r\n%\r\n% *by Steve Eddins*\r\n%\r\n% This story is about creating planar tilings like this:\r\n% \r\n% <<penrose-screen-shot.png>>\r\n% \r\n% This is an example of a Penrose tiling. Penrose tilings are aperiodic tilings \r\n% that named after Roger Penrose, who studied them in the 1970s. This particular \r\n% form, made from two rhombuses, is called a _P3 tiling_.\r\n%% Four Types of Triangles\r\n% Construction of a Penrose P3 tiling is based on 4 types of isosceles triangles. \r\n% The types are labeled A, A', B, and B'. The A and A' triangles have an apex \r\n% angle of 36 degrees, and the B and B' triangles have an apex angle of 72 degrees.\r\n\r\nsubplot(2,2,1)\r\nshowLabeledTriangles(aTriangle([],-1,1))\r\n\r\nsubplot(2,2,2)\r\nshowLabeledTriangles(apTriangle([],-1,1))\r\n\r\nsubplot(2,2,3)\r\nshowLabeledTriangles(bTriangle([],-1,1))\r\n\r\nsubplot(2,2,4)\r\nshowLabeledTriangles(bpTriangle([],-1,1))\r\n%% Triangle Functions and Triangle Representation\r\n% Before proceeding further, let's pause to look at what the functions |aTriangle|, \r\n% |apTriangle|, |bTriangle|, and |bpTriangle| do.\r\n% \r\n% The function |aTriangle| takes three arguments: |aTriangle(apex,left,right)|. \r\n% Each of the three arguments is a point in the complex plane that represents \r\n% one triangle vertex. You specify any two points, passing in the third point \r\n% as |[]|, and |aTriangle| computes the missing vertex for you. Here's an example \r\n% showing how to compute a type A triangle whose base is on the real axis, extending \r\n% from -1 to 1.\r\n%%\r\nt_a = aTriangle([],-1,1)\r\n%% \r\n% The result is returned as a table, which is convenient because we'll be \r\n% creating large collections of these triangles, and it is helpful to be able \r\n% to refer to the different vertices of the triangles using the notation |t.Apex|, \r\n% |t.Left|, and |t.Right|.\r\n% \r\n% The function |showLabeledTriangles| takes a table of triangles and displays \r\n% them all, with the triangle types and their sides labeled. (We'll talk more \r\n% about the labeling of the sides below.)\r\n\r\nt_b = bTriangle(t_a.Apex,t_a.Right,[]);\r\nT = [t_a ; t_b]\r\nclf\r\nshowLabeledTriangles(T)\r\n%% Triangle Side Labels\r\n% The markers on the sides of the triangles help us to distinguish between A \r\n% and A' triangles, as well as between B and B' triangles. For example, an A triangle \r\n% has the circle marker on the left side (assuming the apex is oriented at the \r\n% top), whereas the A' triangle has the circle marker on the right side.\r\n% \r\n% The side labels also help us confirm whether we have a correct arrangement \r\n% of triangles in our Penrose tiling. Triangles are only allowed to share an edge \r\n% in the Penrose P3 tiling if the side markers align together and are the same. \r\n% For example, in the two triangles shown above, the square marker on the right \r\n% edge of the triangle lines up with the square marker on the left edge of the \r\n% B triangle. If we had used a B' triangle instead, the markers would not have \r\n% been identical.\r\n%%\r\nt_bp = bpTriangle(t_a.Apex,t_a.Right,[]);\r\nT = [t_a ; t_bp];\r\nshowLabeledTriangles(T)\r\n%% Making the Two Types of Rhombus\r\n% In the Penrose P3 tiling, one rhombus is made from an A and an A' triangle, \r\n% and the other is made from a B and a B' triangle.\r\n%%\r\nsubplot(1,2,1)\r\nr1 = [ ...\r\n    aTriangle([],-1,1)\r\n    apTriangle([],1,-1)];\r\nshowLabeledTriangles(r1)\r\n\r\nsubplot(1,2,2)\r\nr2 = [ ...\r\n    bTriangle([],-1,1)\r\n    bpTriangle([],1,-1)];\r\nshowLabeledTriangles(r2)\r\n%% Triangle Decomposition\r\n% Construction of the P3 tiling proceeds by starting with one triangle and then \r\n% successively decomposing it. Each of the four types of triangles has a different \r\n% rule for decomposition.\r\n% \r\n% An A triangle decomposes into an A triangle and a B' triangle.\r\n%%\r\nt_a = aTriangle([],-1,1);\r\nt_a_d = decomposeATriangle(t_a)\r\n\r\nclf\r\nsubplot(1,2,1)\r\nshowLabeledTriangles(t_a)\r\nlims = axis;\r\nsubplot(1,2,2)\r\nshowLabeledTriangles(t_a_d)\r\naxis(lims)\r\n%% \r\n% You can look at the very short implementation of |decomposeATriangle| \r\n% to see how this is done.\r\n%%\r\n% \r\n%   function out = decomposeATriangle(in)\r\n%   \r\n%   out = [ ...\r\n%       aTriangle(in.Left,in.Right,[])\r\n%       bpTriangle([],in.Apex,in.Left) ];\r\n%\r\n% \r\n% The smaller A triangle is determined by placing its apex at the left vertex \r\n% of the input triangle and placing its left vertex at the right vertex of the \r\n% input triangle.\r\n% \r\n% The smaller B' triangle is determined by placing its left vertex at the \r\n% apex of the input triangle and placing its right vertex at the left vertex of \r\n% the input triangle.\r\n% \r\n% There are similar rules for decomposing the other three types of triangles.\r\n%%\r\nt_ap = apTriangle([],-1,1);\r\nt_ap_d = decomposeApTriangle(t_ap)\r\n\r\nclf\r\nsubplot(1,2,1)\r\nshowLabeledTriangles(t_ap)\r\nlims = axis;\r\nsubplot(1,2,2)\r\nshowLabeledTriangles(t_ap_d)\r\naxis(lims)\r\n%%\r\nt_b = bTriangle([],-1,1);\r\nt_b_d = decomposeBTriangle(t_b)\r\n\r\nclf\r\nsubplot(2,1,1)\r\nshowLabeledTriangles(t_b)\r\nlims = axis;\r\nsubplot(2,1,2)\r\nshowLabeledTriangles(t_b_d)\r\naxis(lims)\r\n%%\r\nt_bp = bpTriangle([],-1,1);\r\nt_bp_d = decomposeBpTriangle(t_bp)\r\n\r\nclf\r\nsubplot(2,1,1)\r\nshowLabeledTriangles(t_bp)\r\nlims = axis;\r\nsubplot(2,1,2)\r\nshowLabeledTriangles(t_bp_d)\r\naxis(lims)\r\n%% From Triangles to Rhombuses\r\n% Let's start with a B triangle and decompose it three times successively.\r\n%%\r\nt = bTriangle([],-1,1);\r\nt = decomposeTriangles(t)\r\nt = decomposeTriangles(t)\r\nt = decomposeTriangles(t)\r\n%%\r\nclf\r\nshowLabeledTriangles(t)\r\n%% \r\n% Now the labels are getting in the way.\r\n\r\nshowTriangles(t)\r\n%% \r\n% That's better, but it's hard to visualize the rhombuses because the triangle \r\n% bases are being drawn. Let's switch to a different visualization function that \r\n% draws the rhombuses with colored shading and without the triangle bases.\r\n\r\nshowTiles(t)\r\n%% \r\n% Let's do five more levels of decomposition.\r\n%%\r\nfor k = 1:5\r\n    t = decomposeTriangles(t);\r\nend\r\n\r\nnum_triangles = height(t)\r\n%% \r\n% Now we have lots of triangles. Let's take a look.\r\n%%\r\nclf\r\nshowTiles(t)\r\n%% \r\n% Zoom in.\r\n%%\r\naxis([-0.3 0.2 0.1 0.5])\r\n%% \r\n% For fun, you can add to the visualization by inserting arcs or other shapes \r\n% in the triangles. You just need to make everything match up across the different \r\n% types of triangles. The |showDecoratedTiles| function shows one possible variation.\r\n%%\r\nclf\r\nshowDecoratedTiles(t)\r\naxis([-0.2 0.1 0.2 0.4])\r\n%% Starting from Multiple Triangles\r\n% Another interesting thing to try is to start from a pattern of multiple triangles \r\n% instead of just one. You just to arrange the initial triangles so that they \r\n% satisfy the side matching rules. Let's use a circular pattern of alternating \r\n% A and A' triangles sharing a common apex.\r\n%%\r\nt = table;\r\nfor k = 1:5\r\n    thetad = 72*(k-1);\r\n    t_a = aTriangle(0,cosd(thetad) + 1i*sind(thetad),[]);\r\n    t_ap = apTriangle(0,t_a.Right,[]);\r\n    t = [t ; t_a ; t_ap];\r\nend\r\nshowLabeledTriangles(t)\r\n%%\r\nt2 = t;\r\nfor k = 1:4\r\n    t2 = decomposeTriangles(t2);\r\nend\r\nclf\r\nshowDecoratedTiles(t2)\r\n##### SOURCE END ##### e64859885cfb4052859263239595e0e9\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/Back.png\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" \/><\/div><!--introduction--><p>MathWorks is creating a deck of playing cards that will be offered as gifts at our trade show booths.  The design of the cards is based on Penrose Tilings and plots of the Finite Fourier Transform Matrix.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/cleve\/2018\/11\/26\/penrose-and-fourier-design-playing-cards\/\">read more >><\/a><\/p>","protected":false},"author":78,"featured_media":4188,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5,23,4],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/4180"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/comments?post=4180"}],"version-history":[{"count":1,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/4180\/revisions"}],"predecessor-version":[{"id":4182,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/4180\/revisions\/4182"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media\/4188"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media?parent=4180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/categories?post=4180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/tags?post=4180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}