Dimensione arrows in TikZ

  • Creatore
    Topic
  • #73601
    Up
    0
    Down
    ::


    Ciao a tutti,

    vorrei sapere se è possibile ridurre (o aumentare) la dimensione delle frecce disegnate con [tt]TikZ,[/tt] senza però modificare lo spessore della linea. Mi piacerebbe riuscire a ridurre le dimensioni della freccia soprastante che si ottiene con questo codice:
    `\documentclass[a4paper,11pt,extrafontsizes,twoside,openright]{memoir}

    \usepackage{etextools}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}
    \usepackage{microtype}

    \usepackage{xcolor}
    \usepackage{tikz}
    \usetikzlibrary{arrows}
    \usetikzlibrary{backgrounds}
    \usetikzlibrary{calc}
    \usetikzlibrary{intersections}
    \usetikzlibrary{positioning}
    \usetikzlibrary{shadows}
    \usetikzlibrary{shapes}
    \usetikzlibrary{through}

    \begin{document}

    \begin{tikzpicture}
    \draw [->] (0,0) — (3,0);
    \draw [-open triangle 45] (0,1) — (3,1);
    \end{tikzpicture}

    \end{document}`
    È possibile farlo?

    Grazie e buona giornata,
    Marco.

Visualizzazione 9 filoni di risposte
  • Autore
    Risposte
    • #73602
      GKT
      Partecipante
        Up
        0
        Down
        ::


        `\documentclass{article}

        \usepackage{tikz}

        \usetikzlibrary{arrows}
        \usetikzlibrary{decorations.markings}

        \begin{document}
        \begin{tikzpicture}
        \draw [->] (0,0) — (3,0);
        \draw [decoration={markings, mark=at position 1 with {\arrow[scale=.75]{open triangle 45}}},%
        postaction={decorate},%
        ](0,1) — (3,1);
        \end{tikzpicture}
        \end{document}`
        (fonte)

        Resta solo da posizionare la punta della freccia alla fine del segmento, in modo che la linea non intersechi la punta stessa.
        Purtroppo momentaneamente non ho tempo di fare altri tentativi… 🙁

        Lorenzo

      • #73603
        Up
        0
        Down
        ::


        Ciao Lorenzo,

        ti ringrazio! Ho provato a modificare il valore dopo [tt]position,[/tt] ma oltre [tt].85pt[/tt] non viene più disegnata la freccia. Inoltre, vorrei una soluzione generale, non che debba essere sistemata a mano per ogni singolo caso.

        Grazie e buona giornata,
        Marco.

      • #73604
        Liverpool
        Partecipante
          Up
          0
          Down
          ::


          Se ho fatto bene i calcoli, la relazione tra il valore di [tt]shorten[/tt] e la larghezza di linea della punta della freccia è:

          [tt]4.6025+3.58125\pgflinewidth[/tt]

          Se si riesce a stabilire una relazione tra l’opzione [tt]scale[/tt] e la larghezza di linea della punta della freccia, il gioco è fatto. Oppure devi assegnare un valore di [tt]line width[/tt] (anche indirettamente tramite le chiavi [tt]thick[/tt] e compagnia bella). Faccio notare che questo metodo modifica lo spessore della linea della punta della freccia e non so è quello che cerchi.

          Secondo me il modo in cui TikZ definisce le punte delle frecce è qualcosa di incomprensibile.

        • #73605
          Liverpool
          Partecipante
            Up
            0
            Down
            ::


            Hai la necessità di cambiare più volte dimensione all’interno dello stesso documento, oppure ti serve uno stile da usare una volta per tutte?

            Ciao

          • #73606
            Liverpool
            Partecipante
              Up
              0
              Down
              ::


              Il codice che segue è stato realizzato modificando la definizione dello stile [tt]open triangle 45[/tt]. La lunghezza della punta della freccia non dipende più dallo spessore di linea, ma viene passata direttamente all’interno del comando [tt]\draw[/tt] tramite la chiave [tt]/punta[/tt] (nota la barra dritta). Puoi assegnare esplicitamente un valore, oppure usare quello di default o non invocare proprio [tt]/punta[/tt] (in quest’ultimo caso viene utilizzato il valore assegnato nella riga che incomincia con [tt]\pgfsetarrowoptions[/tt]. Penso che gli esempi siano chiari.
              `
              \documentclass{article}
              \usepackage{tikz}

              % Codice per lo stile della freccia
              \pgfarrowsdeclare{freccia45}{freccia45}
              {
              \pgfarrowsleftextend{0pt}
              \pgfarrowsrightextend{+\pgfgetarrowoptions{freccia45}}
              }
              {
              \pgfmathsetlengthmacro{\lun}{\pgfgetarrowoptions{freccia45}/cos(22.5)}
              \pgfsetdash{}{+0pt}
              \pgfsetmiterjoin
              \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{157.5}{\lun}}}
              \pgfpathlineto{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}
              \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{-157.5}{\lun}}}
              \pgfpathclose
              \pgfusepathqstroke
              }
              \def\miodef{0.4cm} % imposta il valore di default
              \pgfsetarrowoptions{freccia45}{\miodef} % valore utilizzato se /punta non viene invocato
              \pgfkeys{/punta/.default=\miodef, /punta/.code={\pgfsetarrowoptions{freccia45}{#1}}}

              \begin{document}
              \begin{tikzpicture}
              \draw [-freccia45, /punta=3pt] (0,3) — (3,3);
              \draw [-freccia45, /punta] (0,2) — (3,2);
              \draw [-freccia45, /punta=1cm] (0,1) — (3,1);
              \draw [-freccia45] (0,0) — (3,0);
              \end{tikzpicture}
              \end{document}`
              Ciao

            • #73607
              Up
              0
              Down
              ::


              Ciao Liverpool,

              grazie davvero! 🙂 C’è un solo e piccolissimo problema: se disegni un segmento [tt]\draw (3,0) — (3,3);[/tt] nell’esempio che hai fornito (peraltro chiarissimo), vedrai che la punta delle frecce “sborda” dal segmento di una quantità che a occhio direi metà spessore del segmento stesso. Basterebbe spostare “indietro” la freccia di una quantità pari allo spessore del segmento che sarebbe perfetto. È possibile?
              `\begin{tikzpicture}
              \draw [-freccia45, /punta=3pt] (0,3) — (3,3);
              \draw [-freccia45, /punta] (0,2) — (3,2);
              \draw [-freccia45, /punta=1cm] (0,1) — (3,1);
              \draw [-freccia45] (0,0) — (3,0);
              \draw (3,0) — (3,3);
              \end{tikzpicture}`

              Grazie mille e buona serata,
              Marco.

            • #73608
              Liverpool
              Partecipante
                Up
                0
                Down
                ::


                Hai ragione. E’ colpa mia. La questione è che quando le linee sono inclinate, una parte delle estremità sporge orizzontalmente, perché lo spessore non è nullo e la lunghezza di linea è calcolata a metà spessore. TikZ, per unire i due tratti obliqui, li prolunga finché i bordi sporgenti della linea non si intersecano. Se alfa è l’inclinazione della linea, allora la parte prolungata sporgerà orizzontalmente di 0.5cosec(alfa)\pgflinewidth, che nel nostro caso è 1.30656297\pgflinewidth, che si può arrotondare un po’ date le modeste dimensioni dello spessore di linea. Così dovrebbe andare
                `
                \documentclass{article}
                \usepackage{tikz}

                % Codice per lo stile della freccia
                \pgfarrowsdeclare{freccia45}{freccia45}
                {
                \pgfarrowsleftextend{0pt}
                \pgfarrowsrightextend{\pgfgetarrowoptions{freccia45}+1.307\pgflinewidth}
                }
                {
                \pgfmathsetlengthmacro{\lun}{\pgfgetarrowoptions{freccia45}/cos(22.5)}
                \pgfsetdash{}{+0pt}
                \pgfsetmiterjoin
                \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{157.5}{\lun}}}
                \pgfpathlineto{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}
                \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{-157.5}{\lun}}}
                \pgfpathclose
                \pgfusepathqstroke
                }
                \def\miodef{0.4cm} % imposta il valore utilizzato per default
                \pgfsetarrowoptions{freccia45}{\miodef} % valore utilizzato se /punta non viene invocato
                \pgfkeys{/punta/.default=\miodef, /punta/.code={\pgfsetarrowoptions{freccia45}{#1}}}

                \begin{document}
                \begin{tikzpicture}
                \draw [-freccia45, /punta=3pt] (0,3) — (3,3);
                \draw [-freccia45, /punta] (0,2) — (3,2);
                \draw [-freccia45, /punta=1cm] (0,1) — (3,1);
                \draw [-freccia45] (0,0) — (3,0);
                \draw (3,0) — (3,3);
                \end{tikzpicture}`

              • #73609
                Up
                0
                Down
                ::


                Ciao Liverpool,

                non so come ringraziarti; in una parola: perfetto! Ora il comportamento è esattamente come quello della freccia di default, con la sola differenza che le dimensioni sono differenti.

                Grazie infinite e buona serata,
                Marco.

              • #73610
                Liverpool
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Ho modificato sia il testo sia il codice dell’intervento precedente con un valore più preciso di quello dato all’inizio (che va bene per un angolo di 46° come quello usato in realtà da TikZ) e con un abbozzo di spiegazione.

                  Buona serata

                • #73611
                  Up
                  0
                  Down
                  ::


                  Ciao Liverpool,

                  stupendo, grazie mille!

                  Ciao,
                  Marco.

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

              Go to top