Rotazione in TikZ

  • Creatore
    Topic
  • #73587
    Up
    0
    Down
    ::


    Ciao a tutti,

    provando a disegnare con [tt]TikZ[/tt] l’immagine che potete vedere qui mi sono scontrato con alcuni problemi. L’immagine è stata ottenuta ruotando rispetto al punto “A” di un angolo alpha. Del punto “A”, in [tt]TikZ,[/tt] non ne conosco le coordinate, ma l’ho determinato come intersezione di due [tt]path.[/tt] Quello che vorrei disegnare in [tt]TikZ[/tt] è la parte in nero. I punti in blu sono il punto “A” e i punti a cui vorrei “ancorare” le etichette.

    1. Se scrivo:
      `\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}
      \coordinate (A) at (0,0);
      \coordinate (B) at (2,0);
      \coordinate (C) at (2,2);
      \coordinate (D) at (0,2);
      \draw [rotate around={-45:($(A)!.5!(D)$)}] (A) rectangle (C);
      \end{tikzpicture}

      \end{document}`
      Ciò che ottengo non è affatto un rettangolo ruotato in senso orario di 45 gradi;

    2. Se scrivo un codice del tutto simile a quello sopra, ma in coordinate espresse esplicitamente di volta in volta, come questo:
      `\begin{tikzpicture}
      \coordinate (A) at (0,0);
      \coordinate (B) at (2,0);
      \coordinate (C) at (2,2);
      \coordinate (D) at (0,2);
      \draw [rotate around={-45:(1,0)}] (0,0) — (2,0);
      \draw [rotate around={-45:(1,0)}] (2,0) — (2,2);
      \draw [rotate around={-45:(1,0)}] (2,2) — (0,2);
      \draw [rotate around={-45:(1,0)}] (0,2) — (0,0);
      \draw

      (2.3,0) — (2.3,2);
      \draw [->,rotate around={-45:(1,0)}] (2.6,1) — (4.6,1);
      \coordinate [label=above:$\tau$,rotate around={-45:(1,0)}] (tau) at (2.3,0);
      \coordinate [label=above:$\sigma$,rotate around={-45:(1,0)}] (sigma) at (3.6,1);
      \end{tikzpicture}`
      ottengo un corretta rotazione degli elementi disegnati (in realtà il quadrato non è disegnato correttamente, basta guardare gli spigoli…), ma le etichette sembrano andare dove vogliono.

    Evidentemente non ho capito bene come gestire le rotazioni in [tt]TikZ.[/tt] Qual è il modo corretto per disegnare la figura di cui ho fornito il link?

    Grazie mille e ciao,
    Marco.

Visualizzazione 12 filoni di risposte
  • Autore
    Risposte
    • #73588
      Up
      0
      Down
      ::

      Marco87″ post=72723Ciao a tutti,

      provando a disegnare con [tt]TikZ[/tt] l’immagine che potete vedere qui mi sono scontrato con alcuni problemi. L’immagine è stata ottenuta ruotando rispetto al punto “A” di un angolo alpha. Del punto “A”, in [tt]TikZ,[/tt] non ne conosco le coordinate, ma l’ho determinato come intersezione di due [tt]path.[/tt] Quello che vorrei disegnare in [tt]TikZ[/tt] è la parte in nero. I punti in blu sono il punto “A” e i punti a cui vorrei “ancorare” le etichette.

      1. Se scrivo:
        `\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}
        \coordinate (A) at (0,0);
        \coordinate (B) at (2,0);
        \coordinate (C) at (2,2);
        \coordinate (D) at (0,2);
        \draw [rotate around={-45:($(A)!.5!(D)$)}] (A) rectangle (C);
        \end{tikzpicture}

        \end{document}`
        Ciò che ottengo non è affatto un rettangolo ruotato in senso orario di 45 gradi;

      2. Se scrivo un codice del tutto simile a quello sopra, ma in coordinate espresse esplicitamente di volta in volta, come questo:
        `\begin{tikzpicture}
        \coordinate (A) at (0,0);
        \coordinate (B) at (2,0);
        \coordinate (C) at (2,2);
        \coordinate (D) at (0,2);
        \draw [rotate around={-45:(1,0)}] (0,0) — (2,0);
        \draw [rotate around={-45:(1,0)}] (2,0) — (2,2);
        \draw [rotate around={-45:(1,0)}] (2,2) — (0,2);
        \draw [rotate around={-45:(1,0)}] (0,2) — (0,0);
        \draw

        (2.3,0) — (2.3,2);
        \draw [->,rotate around={-45:(1,0)}] (2.6,1) — (4.6,1);
        \coordinate [label=above:$\tau$,rotate around={-45:(1,0)}] (tau) at (2.3,0);
        \coordinate [label=above:$\sigma$,rotate around={-45:(1,0)}] (sigma) at (3.6,1);
        \end{tikzpicture}`
        ottengo un corretta rotazione degli elementi disegnati (in realtà il quadrato non è disegnato correttamente, basta guardare gli spigoli…), ma le etichette sembrano andare dove vogliono.

      Evidentemente non ho capito bene come gestire le rotazioni in [tt]TikZ.[/tt] Qual è il modo corretto per disegnare la figura di cui ho fornito il link?

      Grazie mille e ciao,
      Marco.

      Ciao,

      hai provato ad inserire la rotazione come opzione dell’ambiente?

      `
      \begin{tikzpicture}[rotate=..]
      `
      Questo dovrebbe far si che tutti gli elementi seguano quel tipo di rotazione. Trovi un esempio in cui l’ho usata qui (e routa sia le label che il segmento usato come box).

      Ciao
      Claudio

    • #73589
      Up
      0
      Down
      ::


      Ciao Claudio,

      grazie della risposta! Ci sono due problemi:

      1. Il disegno che ho mostrato fa parte di un disegno in cui ci sono altre parti, e solo quella è ruotata. Dichiarare una rotazione globale non mi andrebbe bene, a meno che non si possa inserire un [tt]\begin{tikzpicture} … \end{tikzpicture}[/tt] dentro un altro, ma ho provato e non funziona (seppure non dia alcun errore in fase di compilazione);
      2. Il link che mi hai fornito riguarda i QOC diagram, che non so cosa siano; ma a parte questo non trovo dove guardare per risolvere il mio problema. 🙁

      Grazie mille e ciao,
      Marco.

    • #73590
      Up
      0
      Down
      ::

      Marco87″ post=72728Ciao Claudio,

      grazie della risposta! Ci sono due problemi:

      1. Il disegno che ho mostrato fa parte di un disegno in cui ci sono altre parti, e solo quella è ruotata. Dichiarare una rotazione globale non mi andrebbe bene, a meno che non si possa inserire un [tt]\begin{tikzpicture} … \end{tikzpicture}[/tt] dentro un altro, ma ho provato e non funziona (seppure non dia alcun errore in fase di compilazione);
      2. Il link che mi hai fornito riguarda i QOC diagram, che non so cosa siano; ma a parte questo non trovo dove guardare per risolvere il mio problema. 🙁

      Grazie mille e ciao,
      Marco.

      Pensavo al fatto di far routare completamente la tua figura per questo ti ho allegato l’esempio in cui si sfrutta proprio quella proprietà: se non ci fosse quel `rotate=-90` tutti gli elementi sarebbero disposti diversamente. Nel tuo caso hai ragione (ho guardato solo ora l’immagine campione, scusa): con l’effetto globale si potrebbe far andare al posto giusto il rettangolo i punti blu e le frecce, ma le label e il segmento di congiunzione sarebbero problematici.

      Ciao
      Claudio

      Ciao
      Claudio

    • #73591
      Up
      0
      Down
      ::

      Marco87″ post=72728

      1. Il disegno che ho mostrato fa parte di un disegno in cui ci sono altre parti, e solo quella è ruotata. Dichiarare una rotazione globale non mi andrebbe bene, a meno che non si possa inserire un [tt]\begin{tikzpicture} … \end{tikzpicture}[/tt] dentro un altro, ma ho provato e non funziona (seppure non dia alcun errore in fase di compilazione);

      Per ruotare solo una parte di disegno racchiudila nell’ambiente [tt]scope[/tt] e dai a questo ambiente l’opzione [tt]rotate=…[/tt], dovrebbe andare. Esso è fatto appositamente per applicare opzioni e trasformazioni localmente.

      Ciao
      Fra

    • #73592
      Up
      0
      Down
      ::


      Ciao,

      cfiandra… ho guardato solo ora l’immagine campione, scusa…

      figurati! 🙂

      Dunque, ho fatto delle prove sull’ultimo esempio del mio precedente messaggio. A quanto pare le etichette vengono ruotate correttamente solo se il centro di rotazione non viene specificato esplicitamente, ma così:
      `\begin{tikzpicture}
      \coordinate (A) at (0,0);
      \coordinate (B) at (2,0);
      \coordinate (C) at (2,2);
      \coordinate (D) at (0,2);
      \coordinate (E) at (1,0);
      \draw [rotate around={-45:(1,0)}] (0,0) — (2,0);
      \draw [rotate around={-45:(1,0)}] (2,0) — (2,2);
      \draw [rotate around={-45:(1,0)}] (2,2) — (0,2);
      \draw [rotate around={-45:(1,0)}] (0,2) — (0,0);
      \draw

      (2.3,0) — (2.3,2);
      \draw [->,rotate around={-45:(1,0)}] (2.6,1) — (4.6,1);
      \coordinate [label=225:$\tau$,rotate around={-45:(E)}] (tau) at (2.3,0);
      \coordinate [label=45:$\sigma$,rotate around={-45:(E)}] (sigma) at (3.6,1);
      \end{tikzpicture}`

      Poi, ho visto che scrivendo così:
      `\begin{tikzpicture}
      \draw[help lines] (0,0) grid (7,7);
      \coordinate (A) at (0,0);
      \coordinate (B) at (2,0);
      \coordinate (C) at (2,2);
      \coordinate (D) at (0,2);
      %\coordinate (R) at ($(0,-1)+(canvas polar cs:radius=1cm,angle=90)$);
      coordinate (R) at (0,0);
      \draw [thick,rotate around={-45:(A)}] (R) rectangle ($(R)+(2,2)$);
      \draw

      (2.3,0) — (2.3,2);
      \draw [->,rotate around={-45:(R)}] (2.6,1) — (4.6,1);
      \coordinate [label=225:$\tau$,rotate around={-45:(R)}] (tau) at (2.3,0);
      \coordinate [label=45:$\sigma$,rotate around={-45:(R)}] (sigma) at (3.6,1);
      \end{tikzpicture}`
      il disegno viene tracciato correttamente; ma basta cambiare la “definizione” del punto “R”, de-commentando la prima commentando la seconda, e il rettangolo ruotato sparisce (seppure, evidentemente, il punto “R” continua ad avere coordinate x=0 e y=0).

      Ho provato anche a usare l’ambiente [tt]scope,[/tt] come mi ha suggerito Francesco:
      `\begin{tikzpicture}
      \draw[help lines] (0,0) grid (7,7);
      \coordinate (A) at (0,0);
      \coordinate (B) at (2,0);
      \coordinate (C) at (2,2);
      \coordinate (D) at (0,2);
      %\coordinate (R) at ($(0,-1)+(canvas polar cs:radius=1cm,angle=90)$);
      coordinate (R) at (0,0);
      \begin{scope}[rotate around={-45:(A)}]
      \draw [thick] (R) rectangle ($(R)+(2,2)$);
      \draw

      (2.3,0) — (2.3,2);
      \draw [->] (2.6,1) — (4.6,1);
      \coordinate [label=225:$\tau$] (tau) at (2.3,0);
      \coordinate [label=45:$\sigma$] (sigma) at (3.6,1);
      \end{scope}
      \end{tikzpicture}`
      ma il risultato è sbagliato.

      Non riesco a capire la logica seguita da [tt]TikZ[/tt] nel ruotare. Il risultato sembra avere una certa aleatorietà. 🙁

      Grazie mille intanto e buona serata,
      Marco.

    • #73593
      Up
      0
      Down
      ::


      Ciao,

      lavorandoci sopra un po’ ho tratto due conclusioni (correggetemi se sbaglio):

      1. Confermo che le [tt]label[/tt] vengono ruotate correttamente solo se il centro di rotazione non è scritto esplicitamente;
      2. Ruotare [tt]rectangle[/tt] crea problemi se le coordinate non sono espresse esplicitamente. Se invece si usano le coordinate esplicite le cose funzionano.

      Questo codice funziona in tutto:
      `\begin{tikzpicture}
      \draw [help lines] (0,0) grid (2,2);
      \coordinate (A) at (0,2);
      \coordinate (B) at (0,0);
      \draw [orange,rotate around={90:(A)}] (0,0) rectangle (1,1);
      \draw [orange,rotate around={90:(A)},->] (1.2,0) — (1.2,1);
      \coordinate [orange,rotate around={90:(A)},label=above:P] (P) at (1.2,.5);
      \end{tikzpicture}`

      Ciao,
      Marco.

    • #73594
      Liverpool
      Partecipante
        Up
        0
        Down
        ::

        Marco87″ post=72732Non riesco a capire la logica seguita da [tt]TikZ[/tt] nel ruotare.

        Non ho capito bene perché, per ottenere il disegno di cui parli, vuoi partire dal quadrato con lati paralleli alla figura.
        Comunque, se tu ruoti il disegno di -45°, quella che prima era la diagonale ora diventa un lato, perciò quando dici [tt](A) rectangle (C)[/tt] TikZ ti disegna un rettangolo con altezza nulla, cioè un segmento. Al massimo dovresti scrivere [tt](A) rectangle (D)[/tt], ammesso che io abbia capito bene cosa ti serve.

        Ciao

        Edit: TikZ non ruota le coordinate che hai definito, solo gli oggetti ai quali aggiungi l’opzione [tt]rotate[/tt].

      • #73595
        Up
        0
        Down
        ::


        Ciao Liverpool,

        intanto grazie della risposta! 🙂

        LiverpoolNon ho capito bene perché, per ottenere il disegno di cui parli, vuoi partire dal quadrato con lati paralleli alla figura.

        In che senso “partire”? Io semplicemente vorrei disegnare una figura come quella che ho indicato nel primo messaggio. L’angolo alpha è generico, e quindi mi sembra più comodo disegnare parallelamente alla figura e poi ruotare rispetto a un punto. Comunque, forse, non ho capito cosa intendi dire.

        LiverpoolComunque, se tu ruoti il disegno di -45°, quella che prima era la diagonale ora diventa un lato, perciò quando dici [tt](A) rectangle (C)[/tt] TikZ ti disegna un rettangolo con altezza nulla, cioè un segmento. Al massimo dovresti scrivere [tt](A) rectangle (D)[/tt], ammesso che io abbia capito bene cosa ti serve.

        Così facendo cambia la lunghezza del lato del rettangolo (nel caso in esame, del quadrato). Io pensavo che [tt]TikZ[/tt] disegnasse il rettangolo di diagonale AC, poi ruotasse rigidamente l’intero rettangolo di conseguenza. In effetti questo succede con i segmenti. Se venisse applicata la stessa logica, la lunghezza del segmento cambierebbe, ma non è così. Ulteriore stranezza (per chi è ignorante di [tt]TikZ[/tt] come me): se guardi l’ultimo codice che ho inserito nel messaggio precedente, noterai che in effetti il rettangolo viene ruotato correttamente (seppure, il discorso della diagonale che diventa lato varrebbe ancora), ma solo quando le coordinate sono espresse esplicitamente. Se scrivi:
        `\begin{tikzpicture}
        \draw [help lines] (0,0) grid (2,2);
        \coordinate (A) at (0,2);
        \coordinate (B) at (0,0);
        \coordinate (C) at (1,1);
        \draw [orange,rotate around={90:(A)}] (B) rectangle (C);
        \draw [orange,rotate around={90:(A)},->] (1.2,0) — (1.2,1);
        \coordinate [orange,rotate around={90:(A)},label=above:P] (P) at (1.2,.5);
        \end{tikzpicture}`
        vedrai che non viene più disegnato come prima. A mio avviso, una volta scritto, ad esempio, [tt]\coordinate (B) at (0,0),[/tt] dovrebbe essere uguale usare nel codice [tt](0,0)[/tt] o [tt](B).[/tt] Ma evidentemente non è così.

        LiverpoolTikZ non ruota le coordinate che hai definito, solo gli oggetti ai quali aggiungi l’opzione [tt]rotate[/tt].

        Da quello che vedo, viene spostato il punto a cui si applica l’etichetta, ma non viene ruotato il testo (cosa che, per il mio fine, va benissimo, anzi). Giusto?

        Forse è più semplice chiederti: come disegneresti tu la figura di cui ho messo il link nel primo messaggio?

        Grazie mille,
        Marco.

      • #73596
        Liverpool
        Partecipante
          Up
          0
          Down
          ::



          @Marco
          , come Claudio avevo capito male, perché tu nel codice hai chiamato A uno dei vertici del quadrato, mentre nella figura A è il centro di rotazione.
          Dammi un po’ di tempo e ti rispondo.

        • #73597
          Liverpool
          Partecipante
            Up
            0
            Down
            ::



            @Marco
            , come Claudio avevo capito male, perché tu nel codice hai chiamato A uno dei vertici del quadrato, mentre nella figura A è il centro di rotazione.
            Domani rispondo alle tue osservazioni.

            Marco87″ post=72735Forse è più semplice chiederti: come disegneresti tu la figura di cui ho messo il link nel primo messaggio?

            Io farei così:
            `
            \begin{tikzpicture}
            \def\lato{2} % lunghezza del lato del quadrato
            \def\alfa{-45} % angolo di rotazione
            \tikzstyle{ruota}=[rotate around={\alfa:($(0,0)+(0,\lato/2)$)}]

            \draw [ruota] (0,0) rectangle +(\lato,\lato);
            \draw [-latex', ruota] ($(\lato,\lato) + (0.5,0)$) — ($(\lato,0) + (0.5,0)$);
            \draw [-latex', ruota] ($(\lato,\lato/2) + (1,0)$) — ($(\lato,\lato/2) + (1+\lato,0)$);
            \draw [ruota] ($(\lato,0) + (0.5,-2ex)$) node {$\tau_{r\theta}$};
            \draw [ruota] ($(\lato,\lato/2) + (1+\lato/2,+2ex)$) node {$\sigma_r$};
            \end{tikzpicture}`
            Avrei potuto inserire i nodi delle etichette alla fine dei comandi per le frecce, ma le opzioni tipo [tt]below[/tt] ecc… avrebbero dato problemi (poi studio se si può semplificare).

            Ciao

          • #73598
            Up
            0
            Down
            ::


            Ciao Liverpool,

            non so come ringraziarti!

            Il codice che hai scritto è sopra le mie capacità di programmazione con [tt]TikZ,[/tt] ma cercherò di farne tesoro! 🙂

            Ciao e buona serata!
            Marco.

          • #73599
            Liverpool
            Partecipante
              Up
              0
              Down
              ::


              Ieri mi sono fidato delle tue parole, quando hai detto che con [tt]scope[/tt] il disegno non funzionava, ma non è così. Ti allego una nuova versione del codice, migliore perché tu definisci un ambiente (con [tt]scope[/tt]) e ruoti tutto l’ambiente in una sola volta, anziché ruotare gli oggetti ad uno ad uno.
              `
              \begin{tikzpicture}
              \def\lato{2} % lunghezza del lato del quadrato
              \def\alfa{-45} % angolo di rotazione
              \coordinate (O) at ($(0,\lato/2)$); % centro di rotazione
              \begin{scope}[rotate around={\alfa:(O)}]
              \draw (0,0) rectangle +(\lato,\lato);
              \draw [-left to] ($(\lato,\lato) + (0.5,0)$) — ($(\lato,0) + (0.5,0)$);
              \draw [->] ($(\lato,\lato/2) + (1,0)$) — ($(\lato,\lato/2) + (1+\lato,0)$);
              \draw ($(\lato,0) + (0.5,-2ex)$) node {$\tau_{r\theta}$};
              \draw ($(\lato,\lato/2) + (1+\lato/2,+2ex)$) node {$\sigma_r$};
              \end{scope}
              \end{tikzpicture}`
              Ho capito le tue osservazioni. A me sembra che il problema siano le coordinate implicite nella definizione di [tt]rectangle[/tt], non il centro di rotazione.

              Ciao

            • #73600
              Up
              0
              Down
              ::


              Ciao Liverpool,

              grazie davvero!

              LiverpoolA me sembra che il problema siano le coordinate implicite nella definizione di [tt]rectangle[/tt], non il centro di rotazione.

              Convengo con te. 🙂 Certo, mi piacerebbe capire perché [tt]TikZ[/tt] si comporta in quel modo.

              Buon weekend,
              Marco.

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

          Go to top