Distanza con segno – TikZ

  • Creatore
    Topic
  • #80102
    Up
    0
    Down
    ::


    Ciao a tutti,

    intanto buon week end! 🙂 Sto cercando di creare un nuovo comando da usare nei disegni che realizzo con [tt]TikZ.[/tt] Il comando riceve in ingresso (almeno per ora) due parametri:
    `\newcommand{\myCmd}[2]{…}`
    Questi due parametri sono due punti; mostro l’uso che vorrei del comando:
    `\coordinate (o) at (0,0);
    \coordinate (a) at ($(o)+(canvas polar cs:angle=45,radius=1 cm)$);

    \myCmd{o}{a}`
    Nel comando avrei bisogno di misurare la distanza orizzontale tra [tt](a)[/tt] e [tt](o)[/tt]. Da tempo uso questo comando trovato in rete per misurare la distanza fra due punti (la distanza viene fornita in pt):
    `\makeatletter
    \def\calcLV(#1,#2)#3{%
    \pgfpointdiff{\pgfpointanchor{#1}{center}}%
    {\pgfpointanchor{#2}{center}}%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \FPeval\@temp@a{\pgfmath@tonumber{\pgf@xa}}%
    \FPeval\@temp@b{\pgfmath@tonumber{\pgf@ya}}%
    \FPeval\@temp@sum{(\@temp@a*\@temp@a+\@temp@b*\@temp@b)}%
    \FProot{\FPMathLen}{\@temp@sum}{2}%
    \FPround\FPMathLen\FPMathLen5\relax
    \global\expandafter\edef\csname #3\endcsname{\FPMathLen}
    }
    \makeatother`
    Ora, ho provato a modificarlo in questo modo:
    `\makeatletter
    \def\calcLVXsegno(#1,#2)#3{%
    \pgfpointdiff{\pgfpointanchor{#1}{center}}%
    {\pgfpointanchor{#2}{center}}%
    \pgf@xa=\pgf@x%
    \FPeval\@temp@a{\pgfmath@tonumber{\pgf@xa}}%
    \FPround\@temp@a\@temp@a5\relax
    \global\expandafter\edef\csname #3\endcsname{\@temp@a}
    }
    \makeatother`
    ma, al contrario di quanto suggerisce il nome del comando, il valore restituito è assoluto. C’è modo di far sì che il valore restituito sia invece dotato del segno?

    Un altro approccio a cui ho pensato, visto che in definitiva quello che mi interessa è il confronto fra le coordinate dei due punti, è quello di estrarne in qualche modo le coordinate. Ossia, esiste un comando che applicato ad [tt](a)[/tt] mi restituisca la sua coordinata x? Sarebbe la via più semplice ed elegante secondo me, ma è possibile?

    Grazie mille e buona giornata,
    Marco.

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #80103
      Up
      0
      Down
      ::


      Ciao,

      nel frattempo ho trovato un’altra possibile soluzione: creare un punto a sinistra di quello salvato in [tt]#1[/tt] e uno al di sotto di questo. Misurando la distanza lungo x di questo punto rispetto a quello salvato in [tt]#1[/tt] e rispetto a quello salvato in [tt]#2[/tt] e confrontando questi due valori si è in grado di determinare la posizione relativa (lungo l’asse x, ma similmente anche lungo l’asse y) dei due punti.

      In ogni caso, se si potesse realizzare una delle due soluzioni proposte nel messaggio precedente, sarebbe certamente più rapido ed elegante.

      Grazie e ciao,
      Marco.

    • #80104
      Up
      0
      Down
      ::

      Marco87″ post=79294Ciao,

      nel frattempo ho trovato un’altra possibile soluzione: creare un punto a sinistra di quello salvato in [tt]#1[/tt] e uno al di sotto di questo. Misurando la distanza lungo x di questo punto rispetto a quello salvato in [tt]#1[/tt] e rispetto a quello salvato in [tt]#2[/tt] e confrontando questi due valori si è in grado di determinare la posizione relativa (lungo l’asse x, ma similmente anche lungo l’asse y) dei due punti.

      In ogni caso, se si potesse realizzare una delle due soluzioni proposte nel messaggio precedente, sarebbe certamente più rapido ed elegante.

      Grazie e ciao,
      Marco.

      Non vedo perché usare fp quando PGF/TikZ ha già le sue librerie per il “floating point”

      Ciao
      Enrico

    • #80105
      Up
      0
      Down
      ::


      Ciao Enrico,

      egreg9Non vedo perché usare fp quando PGF/TikZ ha già le sue librerie per il “floating point”

      In realtà quel codice l’ho preso in rete e, per la precisione, qui. In effetti, cercando di capire le righe di quel codice ho cercato sul manuale di [tt]TikZ[/tt] i vari comandi che vi vengono usati, ma alcuni non li ho trovati. Se capissi quelli, forse potrei scriverne i corrispondenti usando le librerie per il “floating point” di [tt]PGF/TikZ.[/tt]

      Ciao,
      Marco.

    • #80106
      Up
      0
      Down
      ::

      Marco87″ post=79298Ciao Enrico,

      Non vedo perché usare fp quando PGF/TikZ ha già le sue librerie per il “floating point”

      In realtà quel codice l’ho preso in rete e, per la precisione, qui. In effetti, cercando di capire le righe di quel codice ho cercato sul manuale di [tt]TikZ[/tt] i vari comandi che vi vengono usati, ma alcuni non li ho trovati. Se capissi quelli, forse potrei scriverne i corrispondenti usando le librerie per il “floating point” di [tt]PGF/TikZ.[/tt]

      Ciao,
      Marco.

      Oltre al codice di Alain Matthes che tu hai utilizzato, su TeX.SX ci sono altre risposte che ti potrebbero essere utili: Coordinates A, B: compute |B-A| and angle between +x and (B-A) e TikZ: How to determine the vector between two co-ordinates. Dico subito però che nessuna aiuta per quanto riguarda il segno.

      In breve, nel codice di Alain si fa uso del pacchetto fp, ma le operazioni base dovrebbero essere (presunte dato che non ho mai usato fp):
      `\pgf@xa=\pgf@x% estrazione coordinata x
      \pgf@ya=\pgf@y% estrazione coordinata y
      \FPeval\@temp@a{\pgfmath@tonumber{\pgf@xa}}% trasformazione in numero e valutazione in floating point
      \FPeval\@temp@b{\pgfmath@tonumber{\pgf@ya}}% idem
      \FPeval\@temp@sum{(\@temp@a*\@temp@a+\@temp@b*\@temp@b)}% somma dei quadrati
      \FProot{\FPMathLen}{\@temp@sum}{2}% radice della somma dei quadrati
      \FPround\FPMathLen\FPMathLen5\relax % arrotondamento di qualche tipo
      \global\expandafter\edef\csname #3\endcsname{\FPMathLen} % stampa in una macro di uscita
      `

      A me di quel codice in realtà è piaciuto il fatto che fornisce una macro in uscita. Per un pacchetto che ho pubblicato qualche minuto fa mi serviva proprio il calcolo della distanza fra due rettangoli, di cui conoscevo le ancore. Ecco come ho risolto:

      `\def\CalcHeight(#1,#2)#3{%
      \pgfpointdiff{\pgfpointanchor{#1}{south west}}{\pgfpointanchor{#2}{north west}}
      \pgfmathsetmacro{\myheight}{veclen(\pgf@x,\pgf@y)}
      \global\expandafter\edef\csname #3\endcsname{\myheight}
      }

      \coordinate (A) at (module1);
      \coordinate (B) at (module\maxsmitem);
      \CalcHeight(A,B){heightmodules}
      \pgfmathadd{\heightmodules}{\priorityarrowheightadvance}
      \pgfmathsetmacro{\distancemodules}{\pgfmathresult}
      `

      Ciao
      Claudio

    • #80107
      Up
      0
      Down
      ::


      Ciao Claudio,

      grazie mille per la risposta! 🙂 Credo che la prima risposta di cui hai fornito il link possa essermi molto utile. Appena riesco, provo a realizzare il nuovo comando che ho in mente, poi farò sapere com’è andata.

      Grazie ancora e buona giornata!
      Marco.

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

Go to top