Posizionare polilinee in tikz

  • Creatore
    Topic
  • #107947
    mattiaca
    Partecipante
      Up
      0
      Down
      ::


      Sto tentando di utilizzare dei \pic per ripetere più volte una stessa figura in un ambiente tikz.
      Trovo difficile l’utilizzo dei \pic per posizionare queste figure, perché il \pic ammette un solo punto di ancoraggio, nel punto di origine di coordinate (0,0) rispetto al quale è stato inizialmente costruito.
      Sarebbe molto utile poter costruire una scatola di ancoraggio simile a quella dei nodi, che racchiudesse il contorno della figura così da stabilire la posizione relativa che la figura deve avere nei confronti di tutti gli altri oggetti del disegno.
      Allego un minimo esempio compatibile
      [attachment=1745]prova1.tex[/attachment]

      Attachments:
      You must be logged in to view attached files.
    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #107948
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          mattiaca” post=108070Sto tentando di utilizzare dei \pic per ripetere più volte una stessa figura in un ambiente tikz.
          Trovo difficile l’utilizzo dei \pic per posizionare queste figure, perché il \pic ammette un solo punto di ancoraggio, nel punto di origine di coordinate (0,0) rispetto al quale è stato inizialmente costruito.
          Sarebbe molto utile poter costruire una scatola di ancoraggio simile a quella dei nodi, che racchiudesse il contorno della figura così da stabilire la posizione relativa che la figura deve avere nei confronti di tutti gli altri oggetti del disegno.
          Allego un minimo esempio compatibile
          [attachment=1745]prova1.tex[/attachment]

          Ciao.
          L’oggetto pic non ha gli ancoraggi come i nodi.
          Una soluzione è proprio quella di creare un nuovo tipo di nodo con gli ancoraggi che desideri. Per questo leggi la documentazione. Anche se almeno fino a qualche tempo fa non era questa una operaizone così semplice.
          R.

        • #107949
          Up
          0
          Down
          ::


          Potresti creare un comando che generi un nodo che prenda come input le coordinate in cui vuoi che esso venga posizionato, nome del nodo e testo; infine, come argomento opzionale, le opzioni del nodo che includano il punto di ancoraggio:
          `
          \documentclass[tikz]{standalone}
          \usepackage{xparse}
          \NewDocumentCommand{\mynode}{%
          O{}
          m
          m
          m
          }{
          {
          \node [#1] (#2) at #3 {#4};
          }
          }
          \begin{document}
          \begin{tikzpicture}
          \draw (0,0)–(1,1);
          \mynode[anchor=south west,draw]{pippo}{(1,1)}{Testo}
          \end{tikzpicture}
          \end{document}
          `

          Per ulteriori spiegazioni ed esempi ti rimando ad una risposta che scrissi tempo fa su tex.sx: (seconda risposta)

          Saluti,
          Mirko

        • #107950
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            mirkom” post=108087Potresti creare un comando che generi un nodo che prenda come input le coordinate in cui vuoi che esso venga posizionato, nome del nodo e testo; infine, come argomento opzionale, le opzioni del nodo che includano il punto di ancoraggio:
            `
            \documentclass[tikz]{standalone}
            \usepackage{xparse}
            \NewDocumentCommand{\mynode}{%
            O{}
            m
            m
            m
            }{
            {
            \node [#1] (#2) at #3 {#4};
            }
            }
            \begin{document}
            \begin{tikzpicture}
            \draw (0,0)–(1,1);
            \mynode[anchor=south west,draw]{pippo}{(1,1)}{Testo}
            \end{tikzpicture}
            \end{document}
            `

            Per ulteriori spiegazioni ed esempi ti rimando ad una risposta che scrissi tempo fa su tex.sx: (seconda risposta)

            Saluti,
            Mirko

            Ma intendi sovrapporre un nodo di forma rettangolare alla pic?
            Il trucco potrebbe funzionare ma solo per forme semplici.
            Oppure intendi costruire un nodo apposito?
            R.

          • #107951
            Up
            0
            Down
            ::


            Dipende da quello che vuole fare l’OP. Nel suo esempio, la pic e’ formata da un nodo rettangolare e una spline che rimane dentro al nodo.

          • #107952
            mattiaca
            Partecipante
              Up
              0
              Down
              ::


              Il problema è che non basta definire il nodo che racchiude la figura (non pretendo per forza che sia corrispondente alle coordinate della spline), ma voglio che l’ancoraggio del comando \pic venga riferito alle ancore del nodo che vado a definire nella pic e non al punto (0,0). Spero che la mia questione sia più chiara.

            • #107953
              Liverpool
              Partecipante
                Up
                0
                Down
                ::

                mattiaca” post=108070Sarebbe molto utile poter costruire una scatola di ancoraggio simile a quella dei nodi, che racchiudesse il contorno della figura così da stabilire la posizione relativa che la figura deve avere nei confronti di tutti gli altri oggetti del disegno.

                Come dice @mirkom, puoi inserire il pic in un nodo. Il codice del nodo deve stare nel corpo del codice principale, non nella definizione del pic. Una cosa del genere:
                `\node [opzioni, inner sep=0pt, outer sep=0pt] at (x,y) {\tikz\pic{nomepic};};`
                In questo modo la “scatola” che racchiude il “contorno” della figura è un rettangolo. Puoi usare le forme di nodi già definite dal pacchetto oppure, come dice @robitex, crearne di altre.
                Rimane fondamentale che la figura sia costruita all’interno del pic in maniera appropriata.

                Ciao

              • #107954
                Liverpool
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Guarda questo codice:
                  `\documentclass[tikz]{standalone}
                  \usetikzlibrary{calc}

                  \tikzset{
                  ancora/.initial=,
                  triangolo/.pic={
                  \tikzset{
                  north east/.style={shift={($(30:1.5)!2!(0,0)$)}},
                  south west/.style={shift={($(210:1)!2!(0,0)$)}},
                  south east/.style={shift={($(-30:1)!2!(0,0)$)}}
                  }
                  \draw [\pgfkeysvalueof{/tikz/ancora}] (210:1) — (-30:1) — (30:1.5) — cycle;
                  }
                  }

                  \begin{document}
                  \begin{tikzpicture}
                  \fill [blue] (-2,0) circle (1.5pt)
                  (0,0) circle (1.5pt)
                  (2,0) circle (1.5pt);
                  \pic [ancora=south west] at (-2,0) {triangolo};
                  \pic [ancora=north east] at (0,0) {triangolo};
                  \pic [ancora=south east] at (2,0) {triangolo};
                  \end{tikzpicture}
                  \end{document}`
                  Sono state definite tre ancore corrispondenti ai vertici del triangolo ai quali sono stati (arbitrariamente) attribuiti i nomi derivati dalla rosa dei venti, come di consueto. Per semplificare il codice, è stata definita la chiave [tt]ancora[/tt] da usare tra le opzioni del pic. Quello che fa è traslare semplicemente il disegno del pic in modo tale che l’ancora indicata coincida con la sua origine e quindi con il punto dichiarato nel codice principale.
                  Noterai che non ho usato i nodi coordinata per definire il percorso. Questo perché, quando trasli il sistema di riferimento, i nodi non vengono spostati, quindi diversamente il codice non funzionerebbe. Questa è la soluzione più semplice, perché potresti traslare la tela (compresi i nodi) con la chiave [tt]transform canvas[/tt], ma poi dovresti ridefinire il bounding box e non è semplice.
                  La libreria [tt]calc[/tt] serve per calcolare l’origine del nuovo sistema di riferimento a partire dalle coordinate delle ancore, cioè i punti simmetrici delle ancore rispetto all’origine del pic. Non è indispensabile perché potresti scriverne direttamente le coordinate, ma l’ho inserita per i più “pigri”.
                  Quando tu scrivi
                  `\pic [ancora=south west] at (-2,0) {triangolo};`
                  l’opzione viene ignorata fino alla riga con il comando [tt]\draw[/tt]. A quel punto, tra le opzioni viene inserito il valore di [tt]ancora[/tt] cioè [tt]south west[/tt]. Ma [tt]south west[/tt] corrisponde a [tt]shift={($(210:1)!2!(0,0)$)}[/tt], quindi è come se stessi scrivendo:
                  `\draw [shift={($(210:1)!2!(0,0)$)}] (210:1) — (-30:1) — (30:1.5) — cycle;`
                  che ha l’effetto di traslare il triangolo in modo tale che il vertice sinistro cada nell’origine del pic e quindi nel punto che hai indicato nel codice.

              Visualizzazione 6 filoni di risposte
              • Devi essere connesso per rispondere a questo topic.

              Go to top