Divisions successives TikZ

Clairon
Modifié (August 2022) dans LaTeX
Hello
Voici un code qui tourne, mais qui ne produit pas l'effet voulu.
\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}
  \def \base{2}
  \def \n{57}
  \node (a0) at (0,0) {$\n$} ;
  % a = b*q + r
  \newcommand \mya {\n}
  \newcommand \myb {\base}
  \foreach \i in {0,1,2}{%
  \pgfmathsetmacro \myq {int(\mya/\myb)}
  \pgfmathsetmacro \myr {int(\mya - \myb*\myq)}
  \coordinate (a\i) at (\i, -\i) ;
  \node (b\i) at (\i+1, -\i) {$\myb$} ;
  \node (q\i) at (\i+1, -\i-1) {$\myq$} ;
  \node (r\i) at (\i, -\i-1) {$\myr$} ;
  \coordinate (T) at ($ (a\i)!.5!(b\i) $) ;
  \draw[thick] (T) -- ++(0,-1) ;
  \coordinate (M) at ($ (a\i)!.5!(q\i) $) ;
  \draw[thick] (M) -- ++(1,0) ;
  \renewcommand \mya {\myq}
  }
\end{tikzpicture}<code>
J'attache la capture d'écran.




J'aimerais plutôt obtenir ces divisions successives


Avez-vous une idée ?

Réponses

  • [Utilisateur supprimé]
    Modifié (August 2022)
    Peut-être en utilisant
        \global\let\mya=\myq
    
    à la place de 
        \renewcommand \mya {\myq}
      
  • Joli coup, merci infiniment dp.

    Du coup, j'abuse encore de tes compétences.
    Aurais-tu une idée pour récupérer le nombre de divisions à effectuer (je veux bien sûr écrire 57 en base b quelconque) sans être obligé de le passer en argument ?

    Ici, je triche, car c'est essentiellement la base 2 qui me sera utile...

    \def \base{2}
    \def \n{57}
    
    \begin{tikzpicture}
      \node (a0) at (0,0) {$\n$} ;
      % a = b*q + r
      \newcommand \mya {\n}
      \newcommand \myb {\base}
      \pgfmathsetmacro \r {int(log2(\n))}
      \foreach \i in {0,1,...,\r}{%
      \pgfmathsetmacro \myq {int(\mya/\myb)}
      \pgfmathsetmacro \myr {int(\mya - \myb*\myq)}
      \coordinate (a\i) at (\i, -\i) ;
      \node (b\i) at (\i+1, -\i) {$\myb$} ;
      \node (q\i) at (\i+1, -\i-1) {$\myq$} ;
      \pgfmathsetmacro \intensite {10*(\i+1)}
      \node[fill = red!\intensite] (r\i) at (\i, -\i-1) {$\myr$} ;
      \coordinate (T) at ($ (a\i)!.5!(b\i) $) ;
      \draw[thick] (T) -- ++(0,-1) ;
      \coordinate (M) at ($ (a\i)!.5!(q\i) $) ;
      \draw[thick] (M) -- ++(1,0) ;
      \global\let\mya=\myq
      }
    \end{tikzpicture}

  • [Utilisateur supprimé]
    Modifié (August 2022)
    Tu peux boucler jusqu’à $n$ et utiliser \breakforeach pour sortir de la boucle lorsque \myq est inférieur à 1:
        \ifnum \myq<1
          \breakforeach
        \fi
        \global\let\mya=\myq


  • Remarquable !

    Merci encore, dp
  • [Utilisateur supprimé]
    Modifié (August 2022)
    Je ne sais pas si ça va t’intéresser d'autant que par manque de temps c'est loin d'être parfait mais j'ai repris rapidement ton code pour en faire une macro un peu plus propre:
    \documentclass[12pt]{article}
    \usepackage{intcalc}
    \usepackage{tikz}
    \usetikzlibrary{calc}
    
    
    
    \newcommand{\divisions}[2]{%
    % #1 = n -- #2 = base
    \begin{tikzpicture}
        \pgfmathsetmacro{\divQ}{ \intcalcDiv{#1}{#2} }
        \pgfmathsetmacro{\divR}{ \intcalcMod{#1}{#2} }
    
        \foreach \i in {0,...,#1} {%
          \pgfmathsetmacro{\intensite}{10*(\i+1)}
    
          \node                      (a\i) at (\i,   -\i)   {\ifnum\i=0$#1$\fi} ;
          \node                      (b\i) at (\i+1, -\i)   {$#2$} ;
          \node                      (q\i) at (\i+1, -\i-1) {$\divQ$} ;
          \node[fill=red!\intensite] (r\i) at (\i,   -\i-1) {$\divR$} ;
    
          \draw[thick] ($ (a\i)!.5!(b\i) $) -- ++(0,-1) ;
          \draw[thick] ($ (a\i)!.5!(q\i) $) -- ++(1,0) ;
    
          \ifnum \divQ<1
            \breakforeach
          \else
            \xdef\divR{ \intcalcMod{\divQ}{#2} };
        	\xdef\divQ{ \intcalcDiv{\divQ}{#2} };
          \fi
        } % end foreach
    \end{tikzpicture}
    }
    
    
    
    \begin{document}
      \divisions{57}{2}
    \end{document}
    
    J'ai aussi utilisé le package intcalc pour effectuer les opérations division et modulo.
  • Merci dp, cela m'intéresse ! 
    Je suis sensible au fait de rendre un code propre.



  • [Utilisateur supprimé]
    Modifié (August 2022)
    Encore une (dernière ?) modification, cette fois en utilisant remember et evaluate dans l'initialisation de la boucle foreach pour se souvenir des variables (et donc se débarrasser des macros low-$\TeX$ \global, \let, et \def, \xdef) tout en les calculant comme on le souhaite.
    \documentclass[12pt]{article}
    \usepackage{intcalc}
    \usepackage{tikz}
    \usetikzlibrary{calc}
    
    
    
    \newcommand{\divisions}[2]{%
    % #1 = n -- #2 = base
    \begin{tikzpicture}
        \foreach \i [evaluate={\R=\intcalcMod{\lastQ}{#2}},
                     evaluate={\Q=\intcalcDiv{\lastQ}{#2}},
                     evaluate={\intensite=\lastintensite+10*\i},
                     remember=\R as \lastR (initially \intcalcMod{#1}{#2}),
                     remember=\Q as \lastQ (initially #1),
                     remember=\intensite as \lastintensite (initially 10)]
                 in {0,...,#1}
        {%
          \node                      (a\i) at (\i,   -\i)   {\ifnum\i=0$#1$\fi} ;
          \node                      (b\i) at (\i+1, -\i)   {$#2$} ;
          \node                      (q\i) at (\i+1, -\i-1) {$\Q$} ;
          \node[fill=red!\intensite] (r\i) at (\i,   -\i-1) {$\R$} ;
    
          \draw[thick] ($ (a\i)!.5!(b\i) $) -- ++(0,-1) ;
          \draw[thick] ($ (a\i)!.5!(q\i) $) -- ++(1,0) ;
    
          \ifnum \Q<1 \breakforeach \fi
        } % end foreach
    \end{tikzpicture}
    }
    
    
    
    \begin{document}
      \divisions{57}{2}
    \end{document}
    
  • Génial !

    Où peut-on apprendre un peu de programmation en TikZ ? Quelle documentation ? Que me conseilles-tu de regarder ?

    merci infiniment dp 
  • [Utilisateur supprimé]
    Modifié (August 2022)
    Je vais t'avouer une chose honteuse : je ne connais presque rien de $\LaTeX$ et TikZ... :D
    En effet, la dernière fois que je les ai utilisés c'était il y a quelque chose comme sept ans et c'était vraiment pas glorieux... en revanche, je connais pas mal $\TeX$, ConTeXt et MetaPost et je suis un expert quand il s'agit de poser des questions à Google ; de plus, je sais assez bien programmer et ce dans plusieurs langages de programmation : c'est ce qui m'a permis de facilement jongler entre LaTeX/Tikz et ConTeXt/MetaPost.
    J'ai donc juste appliqué ce que je sais déjà pour ce que tu m'as demandé et comme tu peux le voir, il m'a fallu trois quatre itérations pour arriver à ce résultat. Sans doute qu'une prochaine itération pourrait permettre d'améliorer encore le tout [par exemple, est-ce bien raisonnable de ne plus utiliser \pgfmathsetmacro pour l'intensité ? Ça force à avoir "deux lignes" au lieu d'une... de plus ça "complique" la macro] mais ça sera sans moi cette fois. :)
    Enfin, je te conseille au moins de lire le volume A du $\TeX$book afin d'en apprendre pas mal sur les arcanes de $\TeX$ puis de t'amuser à lire la documentation de $\LaTeX$. Pour TikZ, c'est surtout LaTeX Draw ainsi que stackexchange qui m'ont aidé à t'aider. Voilà, voilà. :)
  • Super ! Je ne risque pas de m'ennuyer :-) 
Connectez-vous ou Inscrivez-vous pour répondre.