Arco in TikZ

  • Creatore
    Topic
  • #74220
    Up
    0
    Down
    ::


    Ciao a tutti,

    sto cercando di realizzare un disegno con [tt]TikZ.[/tt] Sto incontrando problemi nel realizzare un arco. Conosco il centro dell’arco, ma in [tt]TikZ[/tt] non sembra esserci modo di tenerne conto. Il centro del raggio non è né sotto, né a sinistra, né a destra, né sopra il punto dove dovrebbe iniziare l’arco. Come fare? Non c’è proprio modo di dire a [tt]TikZ[/tt] dove si trova il centro?

    Per ovviare a questo ho provato con questo codice:
    `\documentclass[a4paper,11pt,extrafontsizes,twoside,openright]{memoir}

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

    \usepackage{xcolor}
    \usepackage{tikz}
    \usetikzlibrary{arrows}
    \usetikzlibrary{backgrounds}
    \usetikzlibrary{calc}
    \usetikzlibrary{decorations.pathmorphing}
    \usetikzlibrary{decorations.markings}
    \usetikzlibrary{intersections}
    \usetikzlibrary{positioning}
    \usetikzlibrary{shadows}
    \usetikzlibrary{shapes}
    \usetikzlibrary{through}

    \tikzstyle{ruota}=[rotate around={\alfa:($(0,0)+(0,\lato/2)$)}]
    \tikzstyle{ruota2}=[rotate around={2*\alfa:($(0,0)+(0,\lato/2)$)}]
    \tikzstyle{asse}=[-stealth']

    \pgfarrowsdeclare{freccia45}{freccia45}
    {
    \pgfmathsetlengthmacro{\rex}{\pgfgetarrowoptions{freccia45}+1.28\pgflinewidth}
    \pgfarrowsleftextend{0pt}
    \pgfarrowsrightextend{\rex}
    }
    {
    \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{3.5pt} % 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}}}

    \tikzstyle{misura}=[dashed,-freccia45]
    \tikzstyle{forza}=[very thick,-latex]

    \definecolor{grigio}{rgb}{.85,.85,.85}

    \tikzstyle{quoteBS} = [thin,|-,shorten >=15pt]
    \tikzstyle{quoteDA} = [thin,-|,shorten <=15pt] \newcommand{\quota}[3]{\draw [quoteBS] #1 -- ($#1!.5!#2$);% \draw [align=center] ($#1!.5!#2$) node {#3};% \draw [quoteDA] ($#1!.5!#2$) -- #2;% } \newcommand{\quotaVar}[4]{\draw [quoteBS,shorten >=#4pt] #1 — ($#1!.5!#2$);%
    \draw [align=center] ($#1!.5!#2$) node {#3};%
    \draw [quoteDA,shorten <=#4pt] ($#1!.5!#2$) -- #2;% } %\newlength{\myFm} %\setlength{\myFm}{1cm} \def\myFm{*1cm} \begin{document} \begin{figure} \centering \begin{tikzpicture} %origine \coordinate (O) at (0\myFm,0\myFm); %inferiore e superiore \def\spessore{.5\myFm} \def\lrett{2.5\myFm} \coordinate (inf) at ($(O)+(0\myFm,-\spessore)$); \coordinate (sup) at ($(O)+(0\myFm,\spessore)$); %strato inferiore %raggio, inizio e centro arco inferiore \def\raggioInf{4.5\myFm} \coordinate (InizioInf) at ($(inf)+(-2.5\myFm,0\myFm)$); \coordinate (CentroInf) at ($(inf)+(-2.5\myFm,-\raggioInf)$); \coordinate (estremoArcInfInf) at ($(CentroInf)+(canvas polar cs:angle=125,radius=\raggioInf)$); \coordinate (estremoArcInfSup) at ($(CentroInf)+(canvas polar cs:angle=125,radius=\raggioInf+\spessore)$); %riempimento %arco \pgfpathmoveto{\pgfpoint{-2.5\myFm}{0\myFm}} \pgfpatharc{90}{125}{\raggioInf+\spessore} \pgfpathlineto{\pgfpoint{(-2.5-4.5*sin(35))\myFm}{(4.5*cos(35)-5)\myFm}} \pgfpathlineto{\pgfpoint{-2.5\myFm}{-.5\myFm}} \fill [gray!56]; \pgfpathmoveto{\pgfpoint{-2.5\myFm}{-\spessore}} \pgfpatharc{90}{126}{\raggioInf} \pgfpathlineto{\pgfpoint{-2.5\myFm}{-\spessore}} \fill [white]; %rettangolo \pgfpathmoveto{\pgfpoint{0\myFm}{0\myFm}} \pgfpathlineto{\pgfpoint{-2.55\myFm}{0\myFm}} \pgfpathlineto{\pgfpoint{-2.55\myFm}{-\spessore}} \pgfpathlineto{\pgfpoint{0\myFm}{-\spessore}} \fill [gray!56]; %bordo inferiore \draw (O) -- (inf) -- +(-2.5\myFm,0\myFm) arc (90:125:\raggioInf) -- (estremoArcInfSup); %bordo superiore \draw (inf) -- (O) -- +(-2.5\myFm,0\myFm) arc (90:125:\raggioInf+\spessore) -- (estremoArcInfInf); %strato superiore %raggio, inizio e centro arco superiore \def\raggioSup{4.5\myFm} \coordinate (InizioSup) at ($(sup)+(-2.5\myFm,0\myFm)$); \coordinate (CentroSup) at ($(sup)+(-2.5\myFm,\raggioSup)$); \coordinate (estremoArcSupInf) at ($(CentroSup)+(canvas polar cs:angle=-125,radius=\raggioSup)$); \coordinate (estremoArcSupSup) at ($(CentroSup)+(canvas polar cs:angle=-125,radius=\raggioSup+\spessore)$); %riempimento %arco \pgfpathmoveto{\pgfpoint{-2.5\myFm}{0\myFm}} \pgfpatharc{90}{55}{-\raggioSup-\spessore} \pgfpathlineto{\pgfpoint{(-2.5-4.5*sin(35))\myFm}{(5-4.5*cos(35))\myFm}} \pgfpathlineto{\pgfpoint{-2.5\myFm}{.5\myFm}} \fill [gray!56]; \pgfpathmoveto{\pgfpoint{-2.5\myFm}{\spessore}} \pgfpatharc{90}{54}{-\raggioSup} \pgfpathlineto{\pgfpoint{-2.5\myFm}{\spessore}} \fill [white]; %rettangolo \pgfpathmoveto{\pgfpoint{0\myFm}{0\myFm}} \pgfpathlineto{\pgfpoint{-2.55\myFm}{0\myFm}} \pgfpathlineto{\pgfpoint{-2.55\myFm}{\spessore}} \pgfpathlineto{\pgfpoint{0\myFm}{\spessore}} \fill [gray!56]; %bordo inferiore \draw (sup) -- (O) -- +(-2.5\myFm,0\myFm) arc (90:55:-\raggioInf-\spessore) -- (estremoArcSupSup); %bordo superiore \draw (O) -- (sup) -- +(-2.5\myFm,0\myFm) arc (90:55:-\raggioSup) -- (estremoArcSupSup) -- (estremoArcSupInf); %momento superiore \coordinate (centroMSup) at ($(estremoArcSupInf)!.5!(estremoArcSupSup)+(canvas polar cs:angle=145,radius=.5*\spessore)$); \coordinate (inizioMSup) at ($(centroMSup)+(canvas polar cs:angle=235,radius=.75*\spessore)$); \draw (inizioMSup) -- (centroMSup); \draw [rotate around={235:(centroMSup)},latex'-] (inizioMSup) arc (180:360:.75*\spessore); \end{tikzpicture} \end{figure} \end{document}` però, credo che [tt]TikZ[/tt] sbagli qualcosa nella parte di codice che segue la scritta “%momento superiore”. La rotazione dovrebbe avvenire rispetto a [tt](centroMSup),[/tt] e invece avviene attorno a [tt](inizioMSup).[/tt] ([tt](centroMSup)[/tt] è il centro dell’arco, ed è il punto in alto a destra del segmento unito all’arco che ottenete compilando il codice che ho indicato). Come mai?

    Grazie mille e ciao,
    Marco.

Visualizzazione 1 filone di risposte
  • Autore
    Risposte
    • #74221
      Liverpool
      Partecipante
        Up
        0
        Down
        ::


        Credo che sia lo stesso problema che lamentavi in questa discussione e avevamo concluso che il problema erano le coordinate implicite nella definizione del rettangolo. In questo caso il problema lo dà l’arco; infatti, se provi con delle coordinate esplicite, es: (-5.65,0.95), credo che si ottenga quello che vuoi.
        Quando devo tracciare un arco e conosco il centro e il raggio (praticamente sempre) io preferisco usare il pacchetto [tt]tkz-euclide[/tt].
        Accorgimenti:
        1) nel preambolo
        `\usepackage{tkz-euclide}
        \usetkzobj{all}`
        2) nel codice (se ho capito bene cosa vuoi fare)
        `\tikzset{compass style/.append style={latex'-}}
        \tkzDrawArc[rotate, color=black](centroMSup,inizioMSup)(-180)`
        Nota che nel codice non ci vuole il punto e virgola al termine dell’istruzione.
        Ciao

        P.S.: Se non sbaglio avevo sostituito 1.28 con 1.307 😡

      • #74222
        Up
        0
        Down
        ::


        Ciao Liverpool,

        non so come ringraziarti! 🙂 Mi sembrava assurdo che non ci fosse la possibilità di tracciare un arco specificando il centro, ma nel manuale non son riuscito a trovarlo.

        Grazie mille ancora e buona serata,
        Marco.

    Visualizzazione 1 filone di risposte
    • Devi essere connesso per rispondere a questo topic.

    Go to top