input geometriesyr16; vardef roulades(expr n,m,num,deno,total)= save $; picture $; pair O,A[],B[]; path cc,poly; %numeric totalcen,totaltour O=(0,0); %polygone sur lequel on roule B1=u*(5,-5); %n=8; for k=2 upto n: B[k]=rotation(B1,O,(k-1)*360/n); endfor; B[n+1]=B1; trace B1 for k=2 upto n: --B[k] endfor --cycle withcolor bleu; %polygone roulant A1=B1; A2=(num/deno)[B1,B2]; for k=3 upto m: A[k]=rotation(A[k-2],A[k-1],(180*m-360)/m); endfor; trace A1 for k=2 upto m: --A[k] endfor --cycle withcolor violet; %définition des centres de rotation pair cen[]; cen[0]=B1; totalcen:=0; for k=0 upto n-1: for j=1 upto deno: cen[deno*k+j]:=(j/deno)[B[k+1],B[k+2]]; totalcen:=totalcen+1; endfor; endfor; marque_p:="plein"; for k=0 upto totalcen: pointe(cen[k]); endfor; totaltour:=num*m; totalcentre:=totalcen; for p=1 upto totaltour: for k=0 upto totalcen: cen[p*totalcen+k]=cen[k]; totalcentre:=totalcentre+1; endfor; endfor; %calcul et tracé de la trajectoire pair I[]; I0=A1; ang:=360/m; angn:=360/n; p:=0; path trajectoire; trajectoire=I0--I0; $=image( for k=num step num until total: %show k; if (k-deno*((k div deno))0): if (deno*((k div deno)+1)-k)=0: %message("au revoir"); I[p+1]=rotation(I[p],cen[deno*((k div deno)+1)],3.5*angn); trace arccercle(I[p],I[p+1],cen[deno*((k div deno)+1)]) withcolor orange; trajectoire:=trajectoire..arccercle(I[p],I[p+1],cen[deno*((k div deno)+1)]); p:=p+1; else: %message("bonjour"); I[p+1]=rotation(I[p],cen[deno*(k div deno)],angn); I[p+2]=rotation(I[p+1],cen[k],ang); trace arccercle(I[p],I[p+1],cen[deno*(k div deno)])--arccercle(I[p+1],I[p+2],cen[k]) withcolor orange; trajectoire:=trajectoire..arccercle(I[p],I[p+1],cen[deno*(k div deno)])--arccercle(I[p+1],I[p+2],cen[k]); p:=p+2; fi; elseif (k mod deno)=0: %message("bien joue"); I[p+1]=rotation(I[p],cen[k],ang+angn); if I[p+1]<>I[p]: trace arccercle(I[p],I[p+1],cen[k]) withcolor orange; trajectoire:=trajectoire..arccercle(I[p],I[p+1],cen[k]); fi; p:=p+1; else: %message("perdu"); I[p+1]=rotation(I[p],cen[k],ang); trace arccercle(I[p],I[p+1],cen[k]) withcolor orange; trajectoire:=trajectoire..arccercle(I[p],I[p+1],cen[k]); p:=p+1; fi; endfor; trajectoire:=trajectoire--cycle; ); $ enddef; beginfig(1); trace roulades(3,3,1,7,6); endfig; beginfig(2); trace roulades(3,3,1,7,7); endfig; beginfig(3); trace roulades(3,3,1,7,8); endfig; beginfig(4); trace roulades(3,3,1,7,21); endfig; beginfig(5); trace roulades(3,3,1,11,33); trace hachurage(trajectoire,60,0.3,0); fill B3--B1--B2--cycle withcolor blanc; trace roulades(3,3,1,11,33); endfig; end