Courbes autoa-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,l'exemple de Pierre Délézoide sur UPS-math ; puis suite d'échanges avec R.F. Pour de nombreuses explications, voir sa page : http://www.mathcurve.com/courbes2d/largeur%20constante/largeur%20constante.shtml 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); 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); #demie-ellipse, sa parallèle f:=piecewise(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); 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); 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); paraclo(1,1,-0.1,-0.1,40); 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; para_mobile(3,-1,0,0,30); para_mobile(3,1,0,0,30); para_mobile(3,-1,0.2,0.2,30); para_mobile(5,-2,0,0,30);