\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
% is point "p" inside cyclic path "ring" ?
vardef inside(expr p, ring) =
save t, count, test_line;
count := 0;
path test_line;
test_line = p -- (infinity, ypart p);
for i = 1 upto length ring:
t := xpart (subpath(i-1,i) of ring intersectiontimes test_line);
if ((0 <= t) and (t<1)): count := count + 1; fi
endfor
odd(count)
enddef;
vardef front_half primary p = subpath(0, 1/2 length p) of p enddef;
vardef back_half primary p = subpath(1/2 length p, length p) of p enddef;
% a and b should be cyclic paths...
vardef xoverlap(expr a, b) =
boolean p, q;
p = inside(point 0 of a, b);
q = inside(point 0 of b, a);
if ((not p) and (not q)):
buildcycle(a,b)
elseif (not p):
buildcycle(front_half b, a, back_half b)
elseif (not q):
buildcycle(front_half a, b, back_half a)
else:
buildcycle(front_half a, back_half b, front_half b, back_half a)
fi
enddef;
vardef xcombine(expr a, b) =
boolean p, q;
p = inside(point 0 of a, b);
q = inside(point 0 of b, a);
if (p and q):
buildcycle(a,b)
elseif p:
buildcycle(front_half b, a, back_half b)
elseif q:
buildcycle(front_half a, b, back_half a)
else:
buildcycle(front_half a, back_half b, front_half b, back_half a)
fi
enddef;
vardef overlap(expr a, b) =
save p, q, A, B;
boolean p, q;
p = not inside(point 0 of a, b);
q = not inside(point 0 of b, a);
path A, B;
A = counterclockwise a;
B = counterclockwise b;
if (p and q):
buildcycle(A,B)
elseif p:
buildcycle(front_half B, A, back_half B)
elseif q:
buildcycle(front_half A, B, back_half A)
else:
buildcycle(front_half A, back_half B, front_half B, back_half A)
fi
enddef;
beginfig(4);
path A, B; picture p[];
A = fullcircle scaled 2.5cm;
B = fullcircle scaled 1.8cm shifted (1cm,0);
p1 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
A := A rotated 180;
p2 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
B := B rotatedabout(center B,180);
p3 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
A := A rotated 180;
p4 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
B := B rotatedabout(center B, 180);
A := reverse A;
p5 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
A := A rotated 180;
p6 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
B := B rotatedabout(center B,180);
p7 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);
A := A rotated 180;
p8 = image(fill overlap(A,B) withcolor .8[red,white]; drawarrow A; drawarrow B;);