Una figura “a mano libera” con TikZ

  • Creatore
    Topic
  • #104474
    lorenzo.pantieri
    Partecipante
      Up
      0
      Down
      ::


      Ciao a tutti. Qualcuno ha tempo e voglia di darmi una mano con questa figura?

      Non devo riprodurla esattamente: ho una certa libertà di manovra.

      Non saprei da che parte iniziare per riprodurre la spiaggia sulla destra. Anche la rosa dei venti richiederà una certa pazienza (in mancanza di strumenti più veloci)…

      Grazie anticipate,
      Lorenzo

    Visualizzazione 8 filoni di risposte
    • Autore
      Risposte
      • #104475
        davidebond
        Partecipante
          Up
          0
          Down
          ::


          Lo so che non è quello che desideri… Ma non sarebbe più semplice comporre la figura con un qualsiasi programma di grafica e poi importarla in latex? Ho usato questo pacchetto per creare figure anche complesse, ma si trattava pur sempre di figure geometriche.

          Ciao,

          davide

        • #104476
          lorenzo.pantieri
          Partecipante
            Up
            0
            Down
            ::


            Sì, sarebbe più semplice. Ma ho tutte le figure in TikZ (a parte questa). Per cui, fatto 30, voglio fare 31.

          • #104477
            Up
            0
            Down
            ::


            Qui serve hobby 😉

            Riporto un esempio da cui prendere spunto: per dare una forma più frastagliata basta incrementare il numero di punti. `\documentclass[tikz,border=10pt]{standalone}
            \usetikzlibrary{hobby}

            \begin{document}

            \begin{tikzpicture}
            \draw[help lines,step=0.5] (0,0)grid(4,4);
            % spiaggia
            \fill[gray!50] (2.35,4)
            to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
            (4,1)–(4,4)–(3,4);
            % bordo spiaggia
            \draw(2.35,4)
            to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
            (4,1);
            % città
            \node [circle,fill=black,text=black,inner sep=1pt,label={above:A}](A)at(2.9,2.95){};
            \node [circle,fill=black,text=black,inner sep=1pt,label={above:B}](B)at(3.4,2){};
            \end{tikzpicture}

            \end{document}`
            Ciao
            Claudio

          • #104478
            lorenzo.pantieri
            Partecipante
              Up
              0
              Down
              ::


              `\begin{tikzpicture}[font=\small,scale=1.5]
              \draw [help lines,step=0.25] (0,0) grid (4,4);
              % spiaggia
              \fill [gray!50] (2.35,4) to [curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(3,3)..(3.5,2.85)..(3.5,1.5)}]
              (4,1)–(4,4)–(3,4);
              % bordo spiaggia
              \draw (2.35,4) to [curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(3,3)..(3.5,2.85)..(3.5,1.5)}]
              (4,1);
              % città
              \node [circle,fill=black,text=black,inner sep=1pt,label={above:A}](A) at (3,3){};
              \node [circle,fill=black,text=black,inner sep=1pt,label={right:B}](B) at (3.5,1.5){};

              \draw [thick,red] (3,3) — (1.5,1.5);
              \draw [thick,red] (3.5,1.5) — (1.5,1.5);

              \draw (1.5,1.5) [red,fill=red,very thick] circle (1pt);

              \draw (0.75,2.5) [thick,fill=gray!50] circle (1.5pt);
              \node [above=2pt] at (0.75,2.5) {Isola Rotonda};
              \end{tikzpicture}`
              Grazie al tuo codice ho quasi risolto. Riesci a darmi una mano anche per la bussola? Basta anche qualcosa di più stilizzato rispetto all’ottimo originale…

            • #104479
              Up
              0
              Down
              ::


              Credo che questa possa essere una soluzione

              `\documentclass[a4paper,11pt,twoside,openright,final]{book}
              \usepackage[utf8]{inputenc}
              \usepackage[T1]{fontenc}

              \usepackage{pgfplots,relsize,pgfplotstable,lmodern,pgfkeys, pgfmath}
              \pgfplotsset{compat=1.3}
              \pgfkeys{
              /pgf/number format/.cd, % “change directory”
              use comma
              }
              \usetikzlibrary{plotmarks,arrows.meta,calc,intersections,through,backgrounds,bending}
              \usetikzlibrary{positioning,patterns,decorations.markings}

              \begin{document}

              \begin{figure}
              \centering
              \begin{tikzpicture}
              \draw[step=1cm,gray,very thin](0,0) grid (16,11);

              \path[draw=black,fill=gray] (11,11).. controls (11.2,10.5) .. (11.3,10) .. controls
              (11.5,9.5) .. (12,9).. controls
              (12.1,8.6) .. (12,8).. controls
              (11.7,7).. (12,6.8).. controls
              (13,7.1)..(13.5,7).. controls
              (13.7,6.5)..(13.2,6)..controls
              (13.1,5.7)..(13.2,5).. controls
              (13.1,4.2)..(13.5,4)..controls
              (14,3.8)..(14.3,3)..controls
              (15,2.3)..(15.3,2)..controls
              (15.3,1.8)..(15.5,1.8)..controls
              (15.6,1.8)..(16,1.7)–(16,11)–cycle;

              \path[draw=black,fill=black] (12,9) circle
              (0.1) node[right, xshift=3] () {A};

              \path[draw=black,fill=black] (14.3,3) circle
              (0.1) node[right, xshift=3] () {B};

              \path[draw=black,fill=gray] (2,6) circle
              (0.1) node[above, yshift=3] () {Isola Rotonda};

              \coordinate (R) at (4,9);

              \foreach \angle in {0, 90,180,270}
              {\draw[draw=black,fill=black] (R)–($(R)+(\angle-45:0.2)$)–($(R)+(\angle:1)$)–cycle;
              \draw[draw=black,fill=white] (R)–($(R)+(\angle+45:0.2)$)–($(R)+(\angle:1)$)–cycle;
              \coordinate (D) at ($(R)+(\angle+45:0.2)$);
              \draw[draw=black,fill=black](D)–($(D)+(\angle-9.3535:0.0906)$)–($(D)+(\angle+45:0.5)$)–cycle;
              \draw[draw=black,fill=white](D)–($(D)+(\angle+99.3535:0.0906)$)–($(D)+(\angle+45:0.5)$)–cycle;};

              \node at ($(R)+(0:1.2)$) {E};
              \node at ($(R)+(45:1.2)$) {NE};
              \node at ($(R)+(90:1.2)$) {N};
              \node at ($(R)+(135:1.2)$) {NO};
              \node at ($(R)+(180:1.2)$) {O};
              \node at ($(R)+(215:1.2)$) {SO};
              \node at ($(R)+(270:1.2)$) {S};
              \node at ($(R)+(315:1.2)$) {SE};

              \end{tikzpicture}
              \end{figure}
              \end{document}`

              Probabilmente si può migliorare il bordo, ma i punti sono stati valutati a occhio!

            • #104480
              lorenzo.pantieri
              Partecipante
                Up
                0
                Down
                ::


                `\begin{tikzpicture}[font=\small,scale=1.39]

                \draw [cyan!5,fill=cyan!7.5] (0,0) rectangle (4,4);

                \draw [help lines,step=0.25] (0,0) grid (4,4);

                \coordinate (R) at (1.5,3.5);

                \begin{scope}[scale=0.3,font=\scriptsize]
                \foreach \angle in {0, 90,180,270}
                {\draw[draw=black,fill=black] (R)–($(R)+(\angle-45:0.2)$)–($(R)+(\angle:1)$)–cycle;
                \draw[draw=black,fill=white] (R)–($(R)+(\angle+45:0.2)$)–($(R)+(\angle:1)$)–cycle;
                \coordinate (D) at ($(R)+(\angle+45:0.2)$);
                \draw[draw=black,fill=black](D)–($(D)+(\angle-9.3535:0.0906)$)–($(D)+(\angle+45:0.5)$)–cycle;
                \draw[draw=black,fill=white](D)–($(D)+(\angle+99.3535:0.0906)$)–($(D)+(\angle+45:0.5)$)–cycle;};

                \node at ($(R)+(0:1.2)$) {E};
                \node at ($(R)+(45:1.2)$) {NE};
                \node at ($(R)+(90:1.2)$) {N};
                \node at ($(R)+(135:1.2)$) {NO};
                \node at ($(R)+(180:1.2)$) {O};
                \node at ($(R)+(215:1.2)$) {SO};
                \node at ($(R)+(270:1.2)$) {S};
                \node at ($(R)+(315:1.2)$) {SE};
                \end{scope}

                % spiaggia
                \fill [Maroon!50] (2.35,4) to [curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(3,3)..(3.5,2.85)..(3.5,1.5)}]
                (4,1)–(4,4)–(3,4);
                % bordo spiaggia
                \draw (2.35,4) to [curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(3,3)..(3.5,2.85)..(3.5,1.5)}]
                (4,1);
                % città
                \node [circle,fill=black,text=black,inner sep=1pt,label={above:A}](A) at (3,3){};
                \node [circle,fill=black,text=black,inner sep=1pt,label={right:B}](B) at (3.5,1.5){};

                \draw [thick,red] (3,3) — (1.5,1.5);
                \draw [thick,red] (3.5,1.5) — (1.5,1.5);

                \draw [thick,dashed] (1.5,1.5) — (0.75,1.5);
                \draw [thick,dashed] (0.75,1.5) — (0.75,2.5);
                \draw [blue,thick,dashed] (0.75,2.5) — (1.5,1.5);

                %\draw [thick] (3,3) — (1.5,3);

                \draw (1.5,1.5) [red,fill=red,very thick] circle (1pt);

                \draw (0.75,2.5) [thick,fill=Maroon!50] circle (1.5pt);
                \node [above=2pt] at (0.75,2.5) {Isola Rotonda};

                \end{tikzpicture}`
                Grazie a tutti i vostri interventi, ce l’ho fatta! 🙂

              • #104481
                Up
                0
                Down
                ::

                cfiandra” post=104524Qui serve hobby 😉

                Riporto un esempio da cui prendere spunto: per dare una forma più frastagliata basta incrementare il numero di punti. `\documentclass[tikz,border=10pt]{standalone}
                \usetikzlibrary{hobby}

                \begin{document}

                \begin{tikzpicture}
                \draw[help lines,step=0.5] (0,0)grid(4,4);
                % spiaggia
                \fill[gray!50] (2.35,4)
                to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
                (4,1)–(4,4)–(3,4);
                % bordo spiaggia
                \draw(2.35,4)
                to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
                (4,1);
                % città
                \node [circle,fill=black,text=black,inner sep=1pt,label={above:A}](A)at(2.9,2.95){};
                \node [circle,fill=black,text=black,inner sep=1pt,label={above:B}](B)at(3.4,2){};
                \end{tikzpicture}

                \end{document}`
                Ciao
                Claudio

                Ho provato a lanciare questo esempio compilabile, ma mi da come errore

                (c:/texlive/2015/texmf-dist/tex/latex/hobby/pml3array.sty

                !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                !
                ! LaTeX error: “kernel/command-not-defined”
                !
                ! Control sequence \__msg_show_variable:Nnn undefined.
                !
                ! See the LaTeX3 documentation for further information.
                !
                ! For immediate help type H .
                !………………………………………..

                l.185 …riant:Nn \__msg_show_variable:Nnn { Nno }

                ?

                Ho installato TeXlive da qualche mese e con la versione completa, è possibile che io debba aggiornare qualcosa o il problema è di altra natura?

              • #104482
                Up
                0
                Down
                ::

                schwarz89it” post=104551

                Qui serve hobby 😉

                Riporto un esempio da cui prendere spunto: per dare una forma più frastagliata basta incrementare il numero di punti. `\documentclass[tikz,border=10pt]{standalone}
                \usetikzlibrary{hobby}

                \begin{document}

                \begin{tikzpicture}
                \draw[help lines,step=0.5] (0,0)grid(4,4);
                % spiaggia
                \fill[gray!50] (2.35,4)
                to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
                (4,1)–(4,4)–(3,4);
                % bordo spiaggia
                \draw(2.35,4)
                to[curve through={(2.65,3.75)..(3,3.5)..(2.8,3.45)..(2.7,3.25)..(2.9,2.95)..(3.5,2.85)..(3.4,2)}]
                (4,1);
                % città
                \node [circle,fill=black,text=black,inner sep=1pt,label={above:A}](A)at(2.9,2.95){};
                \node [circle,fill=black,text=black,inner sep=1pt,label={above:B}](B)at(3.4,2){};
                \end{tikzpicture}

                \end{document}`
                Ciao
                Claudio

                Ho provato a lanciare questo esempio compilabile, ma mi da come errore

                (c:/texlive/2015/texmf-dist/tex/latex/hobby/pml3array.sty

                !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                !
                ! LaTeX error: “kernel/command-not-defined”
                !
                ! Control sequence \__msg_show_variable:Nnn undefined.
                !
                ! See the LaTeX3 documentation for further information.
                !
                ! For immediate help type H .
                !………………………………………..

                l.185 …riant:Nn \__msg_show_variable:Nnn { Nno }

                ?

                Ho installato TeXlive da qualche mese e con la versione completa, è possibile che io debba aggiornare qualcosa o il problema è di altra natura?

                Purtroppo è un problema noto: la soluzione è scaricare da https://github.com/loopspace/hobby il .dtx, compilarlo e inserire nel proprio albero personale i file del pacchetto (hobby.code.tex, pgflibraryhobby.code.tex, tikzlibraryhobby.code.tex). Non è una gran soluzione, ma funziona. Per qualcosa di definitivo bisognerà aspettare che l’autore carichi su CTAN la nuova versione.

                Ciao
                Claudio

              • #104483
                Up
                0
                Down
                ::


                grazie mille per la rapida e precisa risposta

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

            Go to top