Creare nuove forme con tikz

  • Creatore
    Topic
  • #71136
    Up
    0
    Down
    ::


    Buongiorno a tutti,
    scrivendo la mia tesi ho bisogno di disegnare alcuni schemi cinematici tipo questo qui. Per far ciò volevo utilizzare tikz quindi vorrei una soluzione che utilizza questo pacchetto. In particolare quello che vorrei fare è creare dei comandi (o delle forme) per automatizzare il disegno dei vincoli seguenti:
    `
    \documentclass[10pt,a4paper]{article}
    \usepackage{tikz}
    \begin{document}
    \begin{tikzpicture}
    % coppia rotoidale
    \draw (0,0) — (1,0) — (0.5,1) — cycle;
    \draw[fill=white] (0.5,.9) circle[radius=0.25];
    % carrello
    \begin{scope}[shift={(3,0)}]
    \draw (0,0) — (1,0) — (0.5,1) — cycle;
    \draw[fill=white] (0.5,0.9) circle[radius=0.25];
    \draw (0.2,-0.2) circle[radius = 0.2];
    \draw (0.8,-0.2) circle[radius = 0.2];
    \end{scope}
    \end{tikzpicture}
    \end{document}`
    in modo da poter scrivere ad esempio [tt]\cr[/tt] oppure [tt]\node[cr] at ..[/tt] ed ottenere il simbolo a sinistra (ovviamente ciò che importa sono le proporzioni e non le dimensioni). Se poi questi potessero comportarsi come dei nodi in cui i centri dei cerchi in alto fossero i riferimenti per il posizionamento sarebbe perfetto, ma comunque non è indispensabile. Ho guardato il manuale di tikz dove al paragrafo 75.5 viene spiegato come creare nuove forme, ma questa via mi sembra alquanto complessa e non so neanche se sia la via giusta.
    Non so se sono stato molto chiaro, in caso cercherò di spiegarmi meglio.

    Grazie
    Fra

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #71137
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        Spike” post=70412Buongiorno a tutti,
        scrivendo la mia tesi ho bisogno di disegnare alcuni schemi cinematici tipo questo qui. Per far ciò volevo utilizzare tikz quindi vorrei una soluzione che utilizza questo pacchetto. In particolare quello che vorrei fare è creare dei comandi (o delle forme) per automatizzare il disegno dei vincoli seguenti:
        `
        \documentclass[10pt,a4paper]{article}
        \usepackage{tikz}
        \begin{document}
        \begin{tikzpicture}
        % coppia rotoidale
        \draw (0,0) — (1,0) — (0.5,1) — cycle;
        \draw[fill=white] (0.5,.9) circle[radius=0.25];
        % carrello
        \begin{scope}[shift={(3,0)}]
        \draw (0,0) — (1,0) — (0.5,1) — cycle;
        \draw[fill=white] (0.5,0.9) circle[radius=0.25];
        \draw (0.2,-0.2) circle[radius = 0.2];
        \draw (0.8,-0.2) circle[radius = 0.2];
        \end{scope}
        \end{tikzpicture}
        \end{document}`
        in modo da poter scrivere ad esempio [tt]\cr[/tt] oppure [tt]\node[cr] at ..[/tt] ed ottenere il simbolo a sinistra (ovviamente ciò che importa sono le proporzioni e non le dimensioni). Se poi questi potessero comportarsi come dei nodi in cui i centri dei cerchi in alto fossero i riferimenti per il posizionamento sarebbe perfetto, ma comunque non è indispensabile. Ho guardato il manuale di tikz dove al paragrafo 75.5 viene spiegato come creare nuove forme, ma questa via mi sembra alquanto complessa e non so neanche se sia la via giusta.
        Non so se sono stato molto chiaro, in caso cercherò di spiegarmi meglio.

        Grazie
        Fra

        Ciao,
        ho scritto un po’ di codice per due comandi appositi ad argomenti delimitati.

        `\documentclass{minimal}
        \usepackage{tikz}

        \def\carrello(#1,#2){%
        \begin{scope}[shift={(#1,#2)}]
        \draw (-0.5,-1) — (+0.5,-1) — (0,0) — cycle;
        \draw[fill=white] (0,0) circle[radius=0.25];
        \draw (0.3,-1.2) circle[radius = 0.2];
        \draw (-0.3,-1.2) circle[radius = 0.2];
        \end{scope}
        }

        \def\cerniera(#1,#2){%
        \begin{scope}[shift={(#1,#2)}]
        \draw (-0.5,-1) — (+0.5,-1) — (0,0) — cycle;
        \draw[fill=white] (0,0) circle[radius=0.25];
        \end{scope}
        }

        \begin{document}
        \begin{tikzpicture}

        % asse asta
        \draw (0,0) — (3,0);

        % coppia rotoidale
        \cerniera(0,0)

        % carrello
        \carrello(3,0)

        \end{tikzpicture}
        \end{document}`

        I vincoli sono centrati nel nodo come puoi vedere.

        Esiste anche un pacchetto pstricks apposito per disegnare schemi strutturali, da valutare con qualche test, realizzando a parte un documento separato per ciascuno schema.
        Si possono anche disegnare i grafici delle caratteristiche di sollecitazione.
        Valuta tu, io non l’ho mai usato.
        Ecco il link

        Saluti.
        R.

      • #71138
        Up
        0
        Down
        ::

        robitex” post=70459Ciao,
        ho scritto un po’ di codice per due comandi appositi ad argomenti delimitati.

        Grande! Non ho provato questa via (diciamo) esterna a TikZ perché non pensavo di poter scrivere codice TikZ all’esterno dell’ambiente [tt]tikzpicture[/tt], ma comunque penso sia più che sufficiente per i miei scopi. Ho guardato anche un po’ il pacchetto. Non è male e la possibilità di disegnare le sollecitazioni è, in generale, molto utile. Nel mio caso penso che preferirò non utilizzarlo in quanto non ho bisogno di disegnare le sollecitazioni ed una soluzione in TikZ è più coerente con il resto.

        Provo e ti faccio sapere. Grazie ancora
        Fra

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

          Spike” post=70462

          Ciao,
          ho scritto un po’ di codice per due comandi appositi ad argomenti delimitati.

          Grande! Non ho provato questa via (diciamo) esterna a TikZ perché non pensavo di poter scrivere codice TikZ all’esterno dell’ambiente [tt]tikzpicture[/tt], ma comunque penso sia più che sufficiente per i miei scopi. Ho guardato anche un po’ il pacchetto. Non è male e la possibilità di disegnare le sollecitazioni è, in generale, molto utile. Nel mio caso penso che preferirò non utilizzarlo in quanto non ho bisogno di disegnare le sollecitazioni ed una soluzione in TikZ è più coerente con il resto.

          Provo e ti faccio sapere. Grazie ancora
          Fra

          Ciao,
          in realtà nessun codice viene eseguito all’esterno dell’ambiente tikzpicture. Solamente che se inserisci i comandi all’interno, TeX espanderà le loro definizione trovandosi all’interno dell’ambiente.
          I comandi sono piuttosto semplici ed hanno il pregio di “centralizzare” la definizione grafica di un vincolo. Cambiare in un unico luogo la definizione grafica infatti, si rifletterebbe immediatamente in tutti i luoghi dove compare il comando.

          Naturalmente si può fare molto meglio di questo.
          Un saluto.
          R.
          R.

        • #71140
          Up
          0
          Down
          ::


          Buonasera a tutti,
          riporto un esempio completo della soluzione che ho adottato alla fine così può essere riutilizzata da qualcun altro in futuro:
          `\documentclass{article}
          \usepackage{tikz}
          \usetikzlibrary{patterns,calc}
          %
          \def\carrello(#1,#2,#3){%
          \begin{scope}[shift={(#1,#2)}]
          \node[draw,circle,fill=#3,minimum width=0.4cm] (S) at (0,0){};
          \draw (S) — (-0.4,-0.8) — (+0.4,-0.8) — (S);
          \draw (0.25,-0.9) circle[radius = 0.1];
          \draw (-0.25,-0.9) circle[radius = 0.1];
          \node (g1) at (0,-1) [ground,anchor=north]{};
          \draw (g1.north west) — (g1.north east);
          \end{scope}
          }
          %
          \def\cerniera(#1,#2,#3){%
          \begin{scope}[shift={(#1,#2)}]
          \node[draw,circle,fill=#3,minimum width=0.4cm] (S) at (0,0){};
          \draw (S) — (-0.4,-1) — (+0.4,-1) — (S);
          \node (g1) at (0,-1) [ground,anchor=north]{};
          \draw (g1.north west) — (g1.north east);
          \end{scope}
          }
          %
          \begin{document}
          \begin{tikzpicture}[>=latex]
          \tikzstyle{ground}=[fill,pattern=north east lines,draw=none,%
          minimum width=1.2cm,minimum height=0.3cm]
          % struttura – schema
          \coordinate (A) at (0,0); \coordinate (B) at (2,0);
          \coordinate (C) at (4,0); \coordinate (D) at (6,0);
          \coordinate (E) at ($(B)!2cm!90:(C)$); \coordinate (F) at ($(D)!2cm!-90:(C)$);
          \draw[very thick] (A) — (B) — (C) — (D) — (F);
          \draw[very thick] (B) — (E);
          % Sistema di riferimento
          \coordinate (O) at ($(A) – (2,0)$);
          \draw[help lines,->] (O) — ($(O) – (0.5,0.5)$) node

          {$x$};
          \draw[help lines,->] (O) — ($(O) – (0,1)$) node

          {$y$};
          \draw[help lines,->] (O) — ($(O) + (1,0)$) node[above] {$z$};
          % vincoli
          \carrello(0,0,white) \cerniera(4,0,none)
          % carichi – in F
          \coordinate (fmx) at ($(F) – (.5,.5)$);
          \coordinate (fmy) at ($(D)!1.5!(F)$);
          \coordinate (fmz) at ($(F) + (1,0)$);
          \draw[->] (fmx) — (F) node[pos=0,left]{$F_{mx}$};
          \draw [->] (fmy) — (F) node[pos=0,left]{$F_{my}$};
          \draw[->] (fmz) — (F) node[pos=0,below]{$F_{mz}$};
          % in E
          \coordinate (fix) at ($(E) + (0.8,0.8)$);
          \draw[->] (fix) — (E) node[pos=0,right]{$F_i$};
          \end{tikzpicture}
          \end{document}`
          Rispetto al codice di Robitex ho modificato un po’ la geometria dei vincoli ed ho aggiunto un terzo parametro che permette di riempire o meno il cerchio in punta ai vincoli così da poter disegnare sia vincoli che dividono due corpi, sia vincoli che non lo fanno. Inoltre ho aggiunto un nuovo stile di nodo (trovato in rete) per disegnare il telaio alla base dei vincoli stessi.

          Grazie ancora a Robitex
          Ciao
          Fra

          P.S. la libreria calc serve solo per come ho definito le forze e le coordinate nel disegno, ma non dovrebbe essere necessaria per disegnare i soli vincoli

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

      Go to top