Télécharger   le fichier Maple "zippé" Voir : CourbesLargeurConstante.txt

Courbes auto-parallèles
Développantes d'épi/hypocycloïde autoparallèles



Développé à la suite de questions sur les courbes auto-parallèles de Robert Ferréol et l'exemple de Pierre Délézoide sur UPS-math ; puis suite d'échanges avec Robert Ferréol.
Pour de nombreuses explications : voir sa page

I. Triangle de Reuleaux plus ou moins "arrondi"

restart:
triangle:= proc(a,u)
local Z,i:
Z[1]:=expand(-a*sqrt(3)/3*exp(I*Pi/6)+(a+u)*exp(I*t)):
Z[4]:=expand(-a*sqrt(3)/3*exp(I*Pi/6)+u*exp(I*t)):
Z[2]:=expand(subs(t=t-Pi/3,Z[1]*exp(2*I*Pi/3))):
Z[5]:=expand(subs(t=t+3*Pi/3 ,Z[4]*exp(2*I*Pi/3))):
Z[3]:=expand(subs(t=t+4*Pi/3,Z[1]*exp(4*I*Pi/3))):
Z[6]:=expand(subs(t=t-0.*Pi/3,Z[4]*exp(4*I*Pi/3))):
plots[display]([seq(plot([Re(Z[i]),Im(Z[i]),t=(i-1)*Pi/3..(i)*Pi/3],color=blue),i=1..3),
seq(plot([Re(Z[i]),Im(Z[i]),t=(i-3)*Pi..(3*(i-3)+1)*Pi/3],color=red),i=4..6)],
scaling=constrained,axes=none);
end:



triangle(1,0);triangle(1,0.1);triangle(1,0.8);

Voir l'image

Voir l'image

Voir l'image

Début  

II. Quelques exemples

> para:=proc(X,Y, L)
local dX_sur_dt, dY_sur_dt, Xp, Yp;
dX_sur_dt:=diff(X,t);dY_sur_dt:=diff(Y,t);
Xp:=X-dY_sur_dt/sqrt(dX_sur_dt^2+dY_sur_dt^2)*L;
Yp:=Y+dX_sur_dt/sqrt(dX_sur_dt^2+dY_sur_dt^2)*L;
Xp,Yp;
end:
with(plots):
graf:=proc(f,g,L,deb,fin)
local courbe,dev:
courbe:=plot([f(t),g(t),t=deb..fin], color=yellow,scaling=constrained,thickness=3,linestyle=0):
dev:=plot([para(f,g,L),t=deb..fin], color=red,thickness=1,linestyle=4):
display([dev,courbe],scaling=constrained);
end:

> # pseudo-triangle de Reuleaux
# Formule donnée par Pierre Délézoide sur les listes UPS-math
Z:=2*exp(I*t)+exp(-2*I*t)+8/3*(1-cos(3*t/2))*exp(-I*t/2):
f:=evalc(Re(Z)): g:=evalc(Im(Z)):


graf(f,g,-16/3,0,6*Pi);

Voir l'image

> #demie-ellipse, sa parallèle
f:=piecewise(t<Pi,3*cos(t),-3*cos(t)+12*cos(t)/(-5*cos(t)^2+9)^(1/2)):
g:=piecewise(t<Pi,2*sin(t),- 2*sin(t)+18*sin(t)/(-5*cos(t)^2+9)^(1/2)):
graf(f,g,6,0,2*Pi);

> # 1/4 de cercle de rayon 3 : parallèle = 1/4 de cercles de rayon 2
# 1/4 ellipse(a=3,b=2) : parallèle = 1/4 ellipse(a=2,b=3)
f:=piecewise(t<Pi/2,3*cos(t),t<3*Pi/2,2*cos(t),-2*cos(t)+15*cos(t)/(5*cos(t)^2+4)^(1/2)):
g:=piecewise(t<Pi,3*sin(t),t<3*Pi/2,2*sin(t),-3*sin(t)+10*sin(t)/(5*cos(t)^2+4)^(1/2)):


graf(f,g,5,0,2*Pi);

Voir l'image

Début  

III. Segment roulant sans glisser sur une courbe

Pg de Ferréol mis sous forme procédure

> restart:
with(plots):
u:=t->[cos(t),sin(t)]:
paraclo:=proc(R,r,k1,k2,n)
local M,N,P,epi,para1,para2,segments,arche,coul,m:
if k1=k2 then m:=2 else m:=4 fi:
M:=expand((R+r)*u(t)+r*u(Pi+t+R*t/r)):
arche:=8*r*(R+r)/R:
N:=expand(M+arche*((cos(R*t/r/4))^2+k1)*u((t+R*t/r/2))):
P:=expand(M-arche*((sin(R*t/r/4))^2+k2)*u((t+R*t/r/2))):
epi:=plot([op(M),t=0..r*2*Pi],color=blue):
para1:=plot([op(N),t=0..r*m*Pi],color=red):
if R mod 2 = 0 then coul:=magenta else coul:=red fi:
para2:=plot([op(P),t=0..r*m*Pi],color=coul):
segments:=display(seq(plot(subs(t=m*k*Pi*r/n,[[N,P,M],[N,P]]),
color=black,thickness=[1,3]),k=0..n-1),insequence=true):

display(epi,para1,para2,segments,scaling=constrained,axes=none);
end:

> paraclo(5,-2,0,0,40);


> paraclo(5,-2,0.1,0.1,30);

Voir l'image

> paraclo(5,-2,-0.1,-0.1,40);

> paraclo(5,-1,0.2,0.2,60);

> paraclo(3,1,0.2,0.2,40);paraclo(3,1,-0.4,-0.4,40);


> paraclo(3,-1,0,0,20);

Voir l'image

> paraclo(2,1,0.1,0.1,30);paraclo(2,1,1/6,1/6,30);

> paraclo(4,-1,0.1,0.1,30);paraclo(4,1,0.1,0.1,30);


> paraclo(1,1,0.25,0.25,30);

Voir l'image

> paraclo(1,1,-0.1,-0.1,40);

Début  

Courbe auto-parallèle (développantes d' épi/hypo ) se déplaçant
et le segment restant fixe

à la demande de RF ; cela permet de bien visualiser que la courbe est de largeur constante

> restart:
norme:=proc( V) (simplify@sqrt@convert)(map(u->u^2,V),`+`); end:
with(plots):
u:=t->[cos(t),sin(t)]:
rot:=(V,c,s) -> [V[1]*c-V[2]*s, V[1]*s+V[2]*c]:
para_mobile:=proc(R,r,k1,k2,n)
local M,N,P,M1,P1,N1,co,si,arche,coul,m,mobi,parois,L:
m:=4:
M:=expand((R+r)*u(t)+r*u(Pi+t+R*t/r)):
arche:=8*r*(R+r)/R:
N:=expand(M+arche*((cos(R*t/r/4))^2+k1)*u((t+R*t/r/2))):
P:=expand(M-arche*((sin(R*t/r/4))^2+k2)*u((t+R*t/r/2))):
co:=cos(t+R*t/r/2); si:=-sin(t+R*t/r/2):
M1:=rot(subs(t=w,M)-N,co,si);
P1:=rot(subs(t=w,P)-N,co,si);
N1:=rot(subs(t=w,N)-N,co,si);

if R mod 2 = 0 then coul:=magenta else coul:=red fi:
mobi:=display([seq(display([
plot([op(subs(t=m*k*Pi*r/n,M1)),w=0..r*2*Pi],color=blue),
plot([op(subs(t=m*k*Pi*r/n,P1)),w=0..r*m*Pi],color=red),
plot([op(subs(t=m*k*Pi*r/n,N1)),w=0..r*m*Pi],color=coul)
]),k=0..n)],
insequence=true):
L:=-(1+k1+k2)*arche :
parois:=polygonplot({[[0,L],[0,-L],[-L/8,-L],[-L/8,L]],
[[L,L],[L,-L],[L+L/8,-L],[L+L/8,L]]},color=yellow):
# if r>0 then parois:=NULL fi; # ? pour enlever les parois si non convexe
display([plot([[0,0],[-arche-(k1+k2)*arche,0]],color=black,thickness=3),mobi,parois],scaling=constrained,axes=none);
end:


tt:=time():para_mobile(1,1,0,0,30);
time()-tt;

Voir l'image

> para_mobile(3,-1,0,0,30);

> para_mobile(3,1,0,0,30);


> para_mobile(3,-1,0.2,0.2,30);

Voir l'image

> para_mobile(5,-2,0,0,30);



Début