samedi 27 septembre 2014

Images vues dans une pyramide de verre

C'est, en quelque sorte, la suite de :
http://pstricks.blogspot.fr/2014/09/image-vue-travers-un-prisme.html

La base de la pyramide est un triangle équilatéral. Une arête a été supprimée et sur le plan ainsi créé l'artisan verrier a gravé une face de la tour Eiffel(ou plutôt ce qui y ressemble).


En regardant à travers la face opposé on voit une tour Eiffel en 3D dans une fausse perspective. L'artiste a habilement utilisé la réflexion totale sur les 2 autres faces pour créer par un effet de double miroir une image en 3D dont l'aspect est très réussi.
Je n'ai pas réalisé de simulation avec POV-Ray ni avec PSTricks, car la difficulté de ces deux projets me fait beaucoup hésiter. Si l'un d'entre-vous, amis lecteurs, se lance dans l'une ou l'autre des réalisations, faites moi signe...

mercredi 24 septembre 2014

Image vue à travers un prisme

On place un prisme droit de verre dont la base est un triangle équilatéral sur une surface plane et on dirige son regard vers l’une des faces (1), bien dans l’axe de symétrie.
On écrit un texte sur une feuille transparente ou blanche et on colle ce texte sur l’une des 2 autres faces verticales.


Voici le texte dans la bonne position avant de le fixer sur le prisme, le cadre blanc est très exactement aux dimensions de la face notée(2).


Le prisme étant positionné, on s’aperçoit que le texte n’est plus visible, mais qu’une image du texte écrit de droite à gauche est visible de l’autre côté. On ne voit, en réalité qu’une partie du texte si celui est trop long.

Cette image est la symétrique du texte par rapport à la troisième face(3). La partie visible est limitée au cadre de la face (1). La base étant un triangle équilatéral, l’image se trouve dans un plan parallèle à la face (1).

L’objet(le texte) est représenté par un flèche en bleu. (BC) est la face (1), (AC) et (AB) respectivement les faces (2) et (3).
Soit n l’indice du verre. L’angle limite λ est donné par la relation :
Pour n = 1.5, λ =42o. Aucun rayon réfracté par la face (2) ne peut ressortir perpendiculairement à la face (1), car le rayon réfracté par la face (2) ferait un angle de réfraction à l’angle limite. En conséquence l’observateur placé devant la face (1) ne peut pas voir le texte placé devant la face (2).
Pour qu’un rayon ressorte perpendiculairement à la face (1) en direction de l’observateur, il doit subir une réflexion sur la face (3). On voit que l’angle de réflexion vaut 60o, supérieur à l’angle limite : il y a donc réflexion totale. Ces rayons qui sont totalement réfléchis par la face (3) proviennent de la face (2) perpendiculairement à celle-ci. La face (3) se comportant comme un miroir, l’observateur voit donc l’image du texte dans ce miroir, elle est symétrique du texte part rapport à la face (3).

POV-Ray possède aussi des grandes capacités pour les simulations de phénomènes optiques, on peut donc l’utiliser pour illustrer ce phénomène. Voici 2 exemples :

Dans le deuxième exemple, on fait varier l'indice de réfraction de 1 à 1.5 et inversement.


Tous les fichiers sont dans ce répertoire :
http://manuel.luque.perso.neuf.fr/Prisme/

Remarque : d’autres exemples avaient déjà été traités en parallèle avec PSTricks comme :
http://pstricks.blogspot.fr/2011/12/le-pentaprisme-etude-optique-et.html
http://pstricks.blogspot.fr/2011/12/dispersion-par-un-prisme-simulation.html
http://melusine.eu.org/syracuse/pstricks/pc/pst-prisme/
http://melusine.eu.org/syracuse/pstricks/pst-caustic/

lundi 15 septembre 2014

Ballet de pendules(pendulum waves) en 3D avec l'ombre des pendules


 Les fichiers :
http://manuel.luque.perso.neuf.fr/PendulumWaves/pendulumWaves3D-v3.tex
http://manuel.luque.perso.neuf.fr/PendulumWaves/pendulumWaves3D-v3.pdf

% Le listing :

\documentclass[10]{article}
\usepackage{pst-solides3d}
\usepackage{animate}
\def\macrosPSPendulumWaves{
    /TabLongueursPendules [
         0 1 np 1 sub {/indicePendule exch def
         gp Gamma 2 Pi mul N0 indicePendule add mul div dup mul mul
         } for
         ] def
         /y0 0.02 def
/asin {neg dup dup mul neg 1 add sqrt neg atan 180 sub} bind def
    /TabAlpha0 [
    0 1 np 1 sub {/iP exch def
        y0 TabLongueursPendules iP get div asin
        } for
    ] def
    /TabZPendules [
    0 1 np 1 sub {/iP exch def
        TabLongueursPendules iP get
        TabAlpha0 iP get cos mul
        } for
    ] def
%    /ti 5 def
    /TabAlphan {[
     0 1 np 1 sub {/iP exch def
        /Alpha TabAlpha0 iP get def
        /Omega 360 Gamma N0 iP add div div def
         Alpha Omega ti mul cos mul
        } for
    ] }def }%
\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% la macro \psRotIIID
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotation autour d'un axe
%\define@key[psset]{pst-solides3d}{angle}{\def\psk@solides@angle{#1 }}% rotation autour de l'axe en degres
%#1 = angle de rotation
%\psRotIIID[solid=...]{angle}(x,y,z)
% (x,y,z) sont les coordonnées du solide comme pour \psSolid[..](x,y,z)
% les coordonnées du vecteur axe sont données par les coordonnées de
% 2 points avec l'option :
% base=x1 y1 z1 x2 y2 z2\def\psRotIIID{\pst@object{psRotIIID}}
\def\psRotIIID@i#1(#2,#3,#4){{%
  \pst@killglue%
  \use@par%
\addto@pscode{
    \tx@optionssolides
    SolidesDict begin
    /cosT {#1 cos} bind def
    /sinT {#1 sin} bind def
     base aload pop
       /f_ exch def
       /e_ exch def
       /d_ exch def
       /c_ exch def
       /b_ exch def
       /a_ exch def
       /u' {d_ a_ sub } bind def
       /v' {e_ b_ sub } bind def
       /w' {f_ c_ sub } bind def
       u' v' w' unitaire3d
       /w_ exch def /v_ exch def /u_ exch def
% end} def
/Rotation3D {
4 dict begin
   /M defpoint3d % on récupère les coordonnées
   M /z exch def
     /y exch def
     /x exch def
%   AXE
   a_ v_ dup mul w_ dup mul add mul
   u_
   b_ v_ mul c_ w_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   x cosT mul add
   c_ v_ mul neg b_ w_ mul add w_ y mul sub v_ z mul add sinT mul add % x'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   b_ u_ dup mul w_ dup mul add mul
   v_
   a_ u_ mul c_ w_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   y cosT mul add
   c_ u_ mul a_ w_ mul sub w_ x mul add u_ z mul sub sinT mul add  % y'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   c_ u_ dup mul v_ dup mul add mul
   w_
   a_ u_ mul b_ v_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   z cosT mul add
   b_ u_ mul neg a_ v_ mul add v_ x mul sub u_ y mul add sinT mul add %z'
end} def
    end}%
\psSolid[transform=Rotation3D](#2,#3,#4)
\composeSolid%
}\ignorespaces%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% transformation d'un point
\def\psRotIIIDPoint{\pst@object{psRotIIIDPoint}}
\def\psRotIIIDPoint@i#1(#2,#3,#4)#5{{% coordonnees cartesiennes
  \pst@killglue%
  \use@par%
\pnode(!
    \tx@optionssolides
    SolidesDict begin
    /cosT {#1 cos} bind def
    /sinT {#1 sin} bind def
     base aload pop
       /f_ exch def
       /e_ exch def
       /d_ exch def
       /c_ exch def
       /b_ exch def
       /a_ exch def
       /u' {d_ a_ sub } bind def
       /v' {e_ b_ sub } bind def
       /w' {f_ c_ sub } bind def
       u' v' w' unitaire3d
       /w_ exch def /v_ exch def /u_ exch def
    #2 #3 #4
     /z_ exch def
     /y_ exch def
     /x_ exch def
   a_ v_ dup mul w_ dup mul add mul
   u_
   b_ v_ mul c_ w_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   x_ cosT mul add
   c_ v_ mul neg b_ w_ mul add w_ y_ mul sub v_ z_ mul add sinT mul add % x'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   b_ u_ dup mul w_ dup mul add mul
   v_
   a_ u_ mul c_ w_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   y_ cosT mul add
   c_ u_ mul a_ w_ mul sub w_ x_ mul add u_ z_ mul sub sinT mul add  % y'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   c_ u_ dup mul v_ dup mul add mul
   w_
   a_ u_ mul b_ v_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   z_ cosT mul add
   b_ u_ mul neg a_ v_ mul add v_ x_ mul sub u_ y_ mul add sinT mul add %z'
   3dto2d cm_1 exch cm_1 exch
   end){#5}%
  }\ignorespaces}
\makeatother
% 15 septembre 2014
\begin{document}

\begin{center}
\def\nImages{201}%  images
\def\base{10 0 0 0 0 0 }%
\begin{animateinline}[controls,loop,%palindrome,
                     begin={\begin{pspicture}(-3,-8)(5,3)},%
                     end={\end{pspicture}}]{5}% 5 images/s
\multiframe{\nImages}{r=0.0+0.035}{%
\psset{viewpoint=25 200 20 rtp2xyz,lightsrc=75 150 20 rtp2xyz,Decran=12.5,unit=1}
\psframe*(-3,-8)(5,3)%
\psPolygonIIID[fillstyle=solid](19,-5,-15)(18,5,0)(18,5,0)(0,5,0)(-1,5,-15)(-1,-5,-15)
\psPolygonIIID[fillstyle=solid,fillcolor=yellow!20](19,-5,-15)(19,5,-15)(19,5,0)(19,-5,0)
\psPolygonIIID[fillstyle=solid,fillcolor=yellow!20](19,5,-15)(-1,5,-15)(-1,5,0)(19,5,0)
\psSolid[object=grille,base=-1 19 -5 5,ngrid=10](0,0,-15)%
\pstVerb{/ti \r\space def
            /Gamma 7 def
            /N0 10 def % nombre d'oscillations de n=0
            /np 10 def % nombre de pendules
            /gp 9.81 def % pesanteur
            /Pi 3.14159265359 def
            /di 2 def % distance entre 2 pendules en cm
            \macrosPSPendulumWaves
            /Lx {gp Gamma 2 Pi mul N0 t di div add mul div dup mul mul} def
            /alpha0 {y0 Lx div asin} def
            /Omega0 {360 Gamma N0 t di div add div div} def
            /alphax {alpha0 Omega0 ti mul cos mul} def%
            /Hh 0 def /Hs 1 def /Hb 1 def /color {Hh Hs Hb} def /dH 1 np div def}%
%\defFunction{Waves}(t){t}{Lx alphax sin mul 100 mul}{Lx alphax cos mul 100 mul neg}%{-15}%
%\psSolid[object=courbe,
%        r=0,
%        range=0 18,
%        linecolor=gray,
%        resolution=360,
%        function=Waves]%
\psset{solidmemory}%
\multido{\i=9+-1}{10}{%
\definecolor[ps]{macouleur}{hsb}{color}%
\pstVerb{
    /Ln TabLongueursPendules \i\space get 100 mul def
    /ANGLE TabAlphan \i\space get neg def
    }%
\psPoint(\i\space di mul,0,0){O}
\psRotIIIDPoint[base=\base,
    ]{ANGLE}(\i\space di mul,0,Ln neg){P}
\psline(O)(P)%\psdot(P)
\psRotIIID[object=sphere,r=0.9,ngrid=9 18,linewidth=0.01,
    name=A,
    fillcolor=macouleur,
    base=\base,
    ]{ANGLE}(\i\space di mul,0,Ln neg)
\pstVerb{/Hh Hh dH add def}%
\psSolid[object=plan,
   definition=equation,
   args={[0 0 1 15] 0},
   action=none,
   name=monplan]
   \psProjection[object=cercle,
    plan=monplan,
    args=\i\space di mul Ln ANGLE neg sin mul .9,linecolor=darkgray,fillcolor=darkgray,linewidth=0.01,fillstyle=solid,opacity=0.6,
    range=0 360]\composeSolid}%
\psLineIIID(-1,5,0)(-1,-5,0)(19,-5,0)
\psLineIIID(-1,-5,0)(-1,-5,-15)
\psLineIIID[linecolor=black,linewidth=0.1](-1,0,0)(19,0,0)%
    }%
\end{animateinline}
\end{center}

\end{document}

Rappel : quelques explications du phénomène et une référence avaient déjà été données dans un précédent article, elles sont dans le document :
http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-version-couleur.pdf
http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-version-couleur.tex

dimanche 14 septembre 2014

Ballet de pendules - Pendulum waves - 3D

Une version en 3D avec pst-solides3d.

Les fichiers :
http://manuel.luque.perso.neuf.fr/PendulumWaves/pendulumWaves3D.pdf
http://manuel.luque.perso.neuf.fr/PendulumWaves/pendulumWaves3D.tex

Avec un point de vue légèrement différent : viewpoint=75 200 20 rtp2xyz


Un autre point de vue :
\psset{viewpoint=20 200 20 rtp2xyz,lightsrc=75 200 20 rtp2xyz,Decran=10,unit=1}

Rappel : quelques explications du phénomène et une référence avaient déjà été données dans un précédent article, elles sont dans le document :
http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-version-couleur.pdf
http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-version-couleur.tex

lundi 8 septembre 2014

Ballet de pendules : l'animation seulement

Le listing du fichier source :

\documentclass[11pt]{article}
 \usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{animate}
\usepackage{pst-plot,pst-node,pst-tools}
\title{Ballet de pendules}
\date{08 septembre 2014}
\newcommand\Bille{
\pscircle[fillstyle=solid,linewidth=1.5\pslinewidth,fillcolor=macouleur](0,0){0.75}
\psarc(0,0){0.6}{-110}{90}
\psarc(0,0){0.45}{-90}{70}
\psarc(0,0){0.3}{-70}{60}}%
\newcommand\Pendule{
\psline(C)
\rput{!TabAlphan \i\space get}(C){\Bille}}%
\psset{dimen=middle}
\def\macrosPSPendulumWaves{
    /TabLongueursPendules [
         0 1 np 1 sub {/indicePendule exch def
         gp Gamma 2 Pi mul N0 indicePendule add mul div dup mul mul
         } for
         ] def
         /y0 0.03 def
/asin {neg dup dup mul neg 1 add sqrt neg atan 180 sub} bind def
    /TabAlpha0 [
    0 1 np 1 sub {/iP exch def
        y0 TabLongueursPendules iP get div asin
        } for
    ] def
    /TabZPendules [
    0 1 np 1 sub {/iP exch def
        TabLongueursPendules iP get
        TabAlpha0 iP get cos mul
        } for
    ] def
%    /ti 5 def
    /TabAlphan {[
     0 1 np 1 sub {/iP exch def
        /Alpha TabAlpha0 iP get def
        /Omega 360 Gamma N0 iP add div div def
         Alpha Omega ti mul cos mul
        } for
    ] }def }%
\begin{document}
\maketitle
\begin{center}
\psset{unit=0.75}
\def\nImages{401}%  images
\begin{animateinline}[controls,loop,%palindrome,
                     begin={\begin{pspicture}(-4.1,-26.1)(4.1,1.1)},%
                     end={\end{pspicture}}]{5}% 5 images/s
\multiframe{\nImages}{r=0.0+0.05}{%
\psframe[fillstyle=solid,fillcolor=yellow!20](-4,-26)(4,1)
\psgrid[subgriddiv=1,gridcolor=lightgray,griddots=10,gridlabels=0pt](-4,-26)(4,1)
\pstVerb{/Hh 0 def /Hs 1 def /Hb 1 def /color {Hh Hs Hb} def /dH 1 15 div def}%
\multido{\i=14+-1}{15}{%
\definecolor[ps]{macouleur}{hsb}{color}%
\pstVerb{/ti \r\space def
/Gamma 20 def
         /N0 20 def % nombre d'oscillations de n=0
         /np 15 def % nombre de pendules (np+1)
         /gp 9.81 def % pesanteur
         /Pi 3.14159265359 def
         /di 1 def % distance entre 2 pendules en cm
\macrosPSPendulumWaves}%
    \pnode(!TabLongueursPendules \i\space get dup TabAlphan \i\space get sin mul 100 mul exch
             TabAlphan \i\space get cos mul neg 100 mul
            ){C}
    \Pendule%
\pstVerb{/Hh Hh dH add def}}%
\rput(0,0.5){\textbf{t=\r\,s}}\psdot(0,0)
\pstVerb{
    /Lx {gp Gamma 2 Pi mul N0 t di div add mul div dup mul mul} def
    /alpha0 {y0 Lx div asin} def
    /alphax {alpha0 360 ti mul Gamma div N0 t di div add mul cos mul} def
    }%
\parametricplot[linecolor=red,linestyle=dotted,linewidth=3\pslinewidth,plotpoints=360]{0}{14}{Lx alphax sin mul 100 mul Lx alphax cos mul neg 100 mul  }%
}
\end{animateinline}
\end{center}
\end{document}

samedi 6 septembre 2014

Ballet de pendules

Ce problème a été étudié par James A. Flaten et Kevin A. Parando dans un article intitulé “Pendulum waves : A lesson in aliasing”, paru en 2001 dans l’American Journal of Physics, Vol 69, N◦7.

http://www.physics.iitm.ac.in/~arul/PH1010/AJP000778PendulumWaves2.pdf

Nous avons une suite de n pendules simples situés, au départ, dans un même plan vertical et dont les longueurs vont en décroissant. L’ensemble des pendules est écarté, perpendiculairement au plan vertical initial,  de leur position d’équilibre, de telle sorte qu’ils soient tous dans le même plan vertical parallèle au plan initial, puis ces pendules abandonnés à eux-mêmes se mettent à osciller chacun avec leur période propre. Les longueurs sont calculées de telle sorte que pour un cycle d’observation Γ, le pendule le plus long, d’indice n0, effectue sur cette durée un nombre entier d’oscillations N, le pendule le plus proche, d’indice n1, N + 1 oscillations, le suivant N + 2 oscillations etc.

Le document suivant, accompagné du fichier source, comprend une étude théorique ainsi que des schémas et une animation réalisée avec le package animate. Cependant, l'étude la plus complète est bien sûr celle réalisée par James A. Flaten et Kevin A. Parando.

http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-test1.pdf
http://manuel.luque.perso.neuf.fr/PendulumWaves/pspendulumwave-test1.tex

Les schémas et animations suivants ont été réalisés pour  Γ=10 s, le pendule plus long effectuant 10 oscillations. Le système comprenant 15 pendules. Voici le système avec les longueurs des pendules en m.


 Il se pose ensuite le problème du déclenchement initial du mouvement de l’ensemble des pendules. Choisissons qu’à l’instant initial tous les pendules sont sur le même plan vertical parallèle à l’axe à une distance y0. Pour les maintenir dans cette position on peut envisager deux solutions. Une planchette dont la partie supérieure sera découpée à la même hauteur que les pendules, ainsi la planchette ne gênera pas les fils ou bien une planchette qui aura été fendue à la position de chaque pendule pour permettre le passage des fils. Voici par exemple, pour la première solution la forme, à l’échelle 1/2 que devra avoir la planchette, les points indiquant la position des pendules. Elle sera rabattue vers le sol à l’instant initial.