\documentclass{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}

input colorbrewer-rgb

numeric phi; phi = 0.61803398875;

path wide[], tall[];
wide0 = origin -- right -- phi * dir 36 -- cycle;
wide1 = origin -- right -- phi * dir -36 -- cycle;
tall0 = origin -- right -- (1+phi) * dir 72 -- cycle;
tall1 = origin -- right -- (1+phi) * dir -72 -- cycle;

vardef half_dart(expr level, a, b, side) =
 save T; path T; T = wide[side] zscaled (b-a) shifted a;
 if level = 0:
   fill T withcolor Purples[9][3+side];
   draw subpath (0, 2) of T;
 else:
   half_dart(level - 1, point 1 of T, point   2 of T, side);
   half_kite(level - 1, point 2 of T, point phi of T, 1-side);
 fi
enddef;

vardef half_kite(expr level, a, b, side) =
 save T; path T; T = tall[side] zscaled (b-a) shifted a;
 if level = 0:
   fill T withcolor Blues[9][2+side];
   draw subpath (0, 2) of T;
 else:
   half_dart(level - 1, point 2     of T, point 2+phi of T, side);
   half_kite(level - 1, point 2+phi of T, point 0     of T, side);
   half_kite(level - 1, point 2+phi of T, point 1+phi of T, 1-side);
 fi
enddef;

beginfig(1);

 picture kite, dart, P[];

 kite = image(
   half_kite(0, origin, 34 dir 198, 0);
   half_kite(0, origin, 34 dir -18, 1);
   label.bot("Kite", 55 down);
 );

 dart = image(
   half_dart(0, origin, 55 dir 234, 0);
   half_dart(0, origin, 55 dir 306, 1);
   currentpicture := currentpicture shifted 4 down;
   undraw origin;
   label.bot("Dart", 55 down);
 );


 pickup pencircle scaled 1/4;

 pair a, b; a = origin; b = 21 dir 198;
 P1 = image(half_kite(0, a, b, 0); dotlabel.ulft("$a$", a); dotlabel.ulft("$b$", b));
 P2 = image(half_kite(1, a, b, 0));

 b := b reflectedabout(up, down);
 P3 = image(half_kite(0, a, b, 1); dotlabel.urt("$a$", a); dotlabel.urt("$b$", b));
 P4 = image(half_kite(1, a, b, 1));
 P5 = image(begingroup; save arr; path arr; arr = (up--down) scaled 12;
   drawarrow arr;
   interim labeloffset := 8;
   label.ulft(P1, point 0 of arr); label.urt(P3, point 0 of arr);
   label.llft(P2, point 1 of arr); label.lrt(P4, point 1 of arr);
 endgroup);

 b := 34 dir 234;
 P6 = image(half_dart(0, a, b, 0); dotlabel.ulft("$a$", a); dotlabel.ulft("$b$", b));
 P7 = image(half_dart(1, a, b, 0));

 b := b reflectedabout(up, down);
 P8 = image(half_dart(0, a, b, 1); dotlabel.urt("$a$", a); dotlabel.urt("$b$", b));
 P9 = image(half_dart(1, a, b, 1));
 P10 = image(begingroup; save arr; path arr; arr = (up--down) scaled 12;
   drawarrow arr;
   interim labeloffset := 8;
   label.ulft(P6, point 0 of arr); label.urt(P8, point 0 of arr);
   label.llft(P7, point 1 of arr); label.lrt(P9, point 1 of arr);
 endgroup);

 label(kite, 42 left);
 label(dart, 42 right);
 label(P5, 134 left);
 label(P10, 134 right);
endfig;
\end{mplibcode}
\end{document}