Split:= proc(s, L) local vals, vmin, vmax, imin, imax, i, n, vlast, ilast, t, slow, shi; # given convex polygon s given by list of vertices, split using L vals:= map(t -> t[1]*L[1]+t[2]*L[2], s); vmin:= min(vals); vmax:= max(vals); if vmin < L[3] and vmax > L[3] then imin:= min[index](vals); imax:= max[index](vals); slow:= s[imin]; vlast:= vmin; ilast:= imin; n:= nops(s); do i:= ilast+1; if i > n then i:= 1 fi; if vals[i] <= L[3] then slow:= slow, s[i]; else if vlast < L[3] then t:= (L[3]-vlast)/(vals[i]-vlast); slow:= slow, (1-t)*s[ilast] + t*s[i]; fi; break fi; ilast:= i; vlast:= vals[i] od; vlast:= vmin; ilast:= imin; do i:= ilast-1; if i = 0 then i:= n fi; if vals[i] <= L[3] then slow:= s[i], slow; else if vlast < L[3] then t:= (L[3]-vlast)/(vals[i]-vlast); slow:= (1-t)*s[ilast] + t*s[i], slow; fi; break fi; ilast:= i; vlast:= vals[i] od; shi:= s[imax]; vlast:= vmax; ilast:= imax; do i:= ilast+1; if i > n then i:= 1 fi; if vals[i] >= L[3] then shi:= shi, s[i]; else if vlast > L[3] then t:= (L[3]-vlast)/(vals[i]-vlast); shi:= shi, (1-t)*s[ilast] + t*s[i]; fi; break fi; ilast:= i; vlast:= vals[i] od; vlast:= vmax; ilast:= imax; do i:= ilast-1; if i = 0 then i:= n fi; if vals[i] >= L[3] then shi:= s[i], shi; else if vlast > L[3] then t:= (L[3]-vlast)/(vals[i]-vlast); shi:= (1-t)*s[ilast] + t*s[i], shi; fi; break fi; ilast:= i; vlast:= vals[i] od; [slow], [shi] else s fi end proc: F:= proc(n) local S, i, j; S:= {seq([[i, 0], [i, 1], [i+1, 1], [i+1, 0]], i=0..n-1)}; for i from 0 to n-1 do for j from i+1 to n do S:= map(Split, S, [-1, j-i, -i]); S:= map(Split, S, [-1, i-j, -j]); od od; nops(S) end proc: map(F, [$1..20]);