Un polygone régulier roule sur l’axe des x.
Tracer la trajectoire d’un sommet A.
Exprimer la distance parcourue par le 
point A quand la "roue" a fait un tour complet.
Avec Xcas on pourra exécuter hexagone.xws pour avoir la correction.
On peut chercher la liste S des affixes des sommets de l”hexagone
lorsque A est en 0 et B est en 1, puis utiliser
polygone(S) ou utiliser directement hexagone(0,1) ou
isopolygone(0,1,6).
Lorsque la "roue" a fait un tour complet, le point A décrit 6 arcs de 
cercle et on met dans L les extrémités de ces arcs (le dernier arc 
est de rayon nul donc on peut dire que la trajectoire est formée de 5 arcs). 
Pour calculer ces extrémités on tape :
a:=normal(affixe(rotation(1,-pi/3,0)));
b:=normal(affixe(rotation(2,-pi/3,a))),
puis on complète par symétrie par rapport à x=3
AL est la liste de ces 5 arcs lorsque la "roue" a fait un tour complet.
BL est la liste AL translatée : on a ainsi la trajectoire du 
point A lorsque la "roue" a fait 2 tours complets.
On définit Hs la figure formée par l’hexagone de centre O
et le segment AO : on visualise ainsi le point A.
Pour faire une animation on va créer la liste LH contenant plusieurs 
positions de Hs obtenues par deux rotations de centre 1 d’angle −π/6
et −π/3, deux rotations de centre 2 d’angle −π/6 et −π/3 etc...
On obtient ainsi une liste de 12 éléments.
On tape :
L:=[0,1/2+i*sqrt(3)/2,2+i*sqrt(3),4+i*sqrt(3),11/2+i*sqrt(3)/2,6];
affichage((AL:=seq(arc(L[k],L[k+1],-pi/3),k,0,4)),hidden_name);
affichage((BL:=translation(6,AL)),hidden_name);
Hs:=[isopolygone(0,1,6),segment(0,(1+i*sqrt(3))/2)];
LH:=[Hs];
for (j:=0;j<12;j++){LH:=concat(LH,[rotation(j+1,-pi/6,LH[2*j]),rotation(j+1,-pi/3,LH[2*j])])}:;
affichage((A:=seq(arc(L[k],L[k+1],-pi/3),k,0,4)),hidden_name);
affichage((B:=translation(6,A)),hidden_name);
animation(LH);
Le point A décrit des 6 arcs de cercles qui sont :
donc la distance parcourue par le point A quand la ‘"roue" a fait un tour 
complet est π(4+2√3)/3.
On peut aussi calculer cette longueur à l’aide d’une boucle.
On tape :
dist:=0;
for (k:=0;k<5;k++){arc(L[k],L[k+1],-pi/3,C,R);
            dist:=dist+R*pi/3;};
normal(dist)
Avec Xcas on pourra exécuter rouepoly.xws pour avoir la correction.
On va écrire des procédures de param‘etre n qui représente le 
nombre de côtés de l’isopolygône.
Lsarc(n) renvoie la liste des sommets des arcs qui forment la 
trajectoire de A.
Lpoly(n) renvoie la liste des positions successives de la figure formée
par P l’isopolgône de centre O, et S le segment 
OA. On pourra ainsi faire facilement une animation.
tracerarc(n) ou tracer(n) trace la trajectoire lorsque
la "roue" a fait 2 tours complets.
longtrajet(n) renvoie la longueur d’une arche : le résultat est 
approché, mais on peut supprimer evalf pour avoir un résultat exact 
lorsque n=3,4,6.
On tape :
  Lsarc(n):={
    local L,j;
    L:=[point(0)];
    for (j:=1;j<n;j++){
      L:=concat(L,normal(rotation(j,-2*pi/n,L[j-1])));
    }
    return(L);
  };
Lpoly(n):={
local LP,j,P,S;
P:=normal(isopolygone(0,1,n));
S:=segment(0,evalf(1/2+i/2/tan(pi/n)));
LP:=[[P,S]];
for (j:=0;j<2*n;j++){
LP:=concat(LP,[rotation(j+1,evalf(-pi/n),LP[2*j]),
           rotation(j+1,evalf(-2*pi/n),LP[2*j])]);
}
return LP;
};
tracerarc(n):={
  local A,B,Ls;
  Ls:=evalf(Lsarc(n));
  A:=seq(arc(Ls[k],Ls[k+1],evalf(-2*pi/n)),k,0,n-2);
  B:=translation(n,A);
  return concat(A,B);
};
//ou encore
tracer(n):={
  local A,B,j,Ls;
  Ls:=evalf(Lsarc(n));
  A:=[arc(Ls[0],Ls[1],evalf(-2*pi/n))];
  for (j:=1;j<n-1;j++){
    A:=concat(A,arc(Ls[j],Ls[j+1],-2*pi/n));
  }
  B:=translation(n,A);
  return(A,B)
};
longtrajet(n):={
local dist,k,C,R;
dist:=0
for (k:=0;k<(n-1);k++){
  arc((Lsarc(n))[k],(Lsarc(n))[k+1],-pi/3,C,R);
  dist:=evalf(dist+R*pi/3);
};
return normal(dist);
}
On tape par exemple, pour avoir une animation :
tracerarc(5);animation(Lpoly(5))