Marco87″ post=79354Ciao Enrico,
chiedo scusa. Ecco un codice che riproduce il comportamento che ho descritto:
`\documentclass[a4paper,11pt,extrafontsizes,twoside,openright]{memoir}
\usepackage{etex}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[greek,italian]{babel}
\usepackage{microtype}
\pagestyle{empty}
\usepackage{ifthen}\usepackage{xcolor}
\usepackage{tikz}
% Librerie
\usetikzlibrary{automata}
\usetikzlibrary{arrows}
\usetikzlibrary{backgrounds}
\usetikzlibrary{calc}
\usetikzlibrary{hobby}
\usetikzlibrary{intersections}
\usetikzlibrary{patterns}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows}
\usetikzlibrary{shapes}
\usetikzlibrary{through}
% Pacchetti
\usepackage{tkz-euclide}
\usetkzobj{all}% TikZ
%Distanza fra due punti (la lunghezza viene espressa in punti, quindi usare \calcLV 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% Distanza fra due punti lungo X (la lunghezza viene espressa in punti, quindi usare \calcLVX pt)
\makeatletter
\def\calcLVX(#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% Distanza fra due punti lungo Y (la lunghezza viene espressa in punti, quindi usare \calcLVY pt)
\makeatletter
\def\calcLVY(#1,#2)#3{%
\pgfpointdiff{\pgfpointanchor{#1}{center}}%
{\pgfpointanchor{#2}{center}}%
\pgf@ya=\pgf@y%
\FPeval\@temp@a{\pgfmath@tonumber{\pgf@ya}}%
\FPround\@temp@a\@temp@a5\relax
\global\expandafter\edef\csname #3\endcsname{\@temp@a}
}
\makeatother% MIO NUOVO COMMANDO
\newcommand{\my}[4]{%
\coordinate (medio) at ($(#1)!.5!(#2)$);
\calcLV(#1,medio){dist}
\coordinate (o) at (0,0);
\coordinate (temp) at (#3,0);
\calcLV(o,temp){rag}
\pgfmathsetmacro{\differenza}{\dist-\rag}
%
\ifdim \differenza pt = 0 pt
\def\abc{2}
\else
\def\abc{3}
\fi
}\begin{document}
\begin{tikzpicture}[scale=1]
\draw [help lines] (0,0) grid (3,3);
\coordinate [label={270:\tiny $O$}] (or) at (0,0);
\coordinate [label={270:\tiny $A$}] (a) at (50:2);
\coordinate [label={270:\tiny $B$}] (b) at (50+180:2);\my{a}{b}{2}{}
\fill [black] (a) circle (1.5pt);
\fill [black] (b) circle (1.5pt);
\fill [cyan] (\abc,\abc) circle (2pt);\end{tikzpicture}
\end{document}`
Nel comando [tt]\my[/tt] quello che faccio (cerco di fare) per ora è eseguire questo:
- Dati due punti, ne creo uno posto esattamente al centro;
- Misuro la distanza che c’è tra questo e uno dei due punti forniti in ingresso;
- Converto il raggio inserito in ingresso in pt (sull’efficienza del mio codice credo che ci sia molto da dire);
- Calcolo la differenza che c’è tra queste due distanze;
- A seconda del valore di questa differenza eseguo un codice o un altro.
Nell’esempio che ho riportato [tt]\differenza[/tt] dovrebbe essere nulla, di conseguenza [tt]\abc[/tt] dovrebbe essere pari a [tt]2,[/tt] e quindi il punto azzurro dovrebbe avere coordinate [tt](2,2),[/tt] ma non è così. Cosa sbaglio?
Grazie e buona giornata,
Marco.
Alcuni consigli:
1) puoi fare un po’ di debug creando un nodo e stampando le misure che ti servono. Esempio:
`\newcommand{\my}[4]{%
\coordinate (medio) at ($(#1)!.5!(#2)$);
\calcLV(#1,medio){dist}
\coordinate (o) at (0,0);
\coordinate (temp) at (#3,0);
\calcLV(o,temp){rag}
\node at (o) {\rag};
\pgfmathsetmacro{\differenza}{\dist-\rag}
\node at ($(medio)!0..5!(o)$) {\differenza};
%
\ifdim \differenza pt = 0 pt
\def\abc{2}
\else
\def\abc{3}
\fi
}`
È una cosa abbastanza utile che permette di capire se ci sono errori grossi.
2) Puoi utilizzare funzioni interne di pgf; cerca sul manuale Comparison and logical functions. O anche il pacchetto etoolbox.
3) A volte è necessario andare a spulciare proprio il codice di pgf per capire alcune cose (parlo in primis per le librerie).. in genere poi uno si deprime perché non è proprio banale, però aiuta. Ad esempio tu stai utilizzando il pacchetto pgfmath. Vai sul terminale e digita (beh.. se utilizzi linux)
`
gedit $(kpsewhich pgfmath.sty)
`
Ti aprirà il file con il codice del pacchetto. Ora preparati a qualche decina di scatole cinesi.. ogni volta che trovi qualche [tt]\input[/tt] in teoria è qualcosa di interessante. Ad esempio, pgfmath.sty è così composto:
`
\input{pgfmath.code.tex}
\endinput
` Apri quindi [tt]pgfmath.code.tex[/tt] con:
`
gedit $(kpsewhich pgfmath.code.tex)
` Perciò sono di potenziale interesse [tt]pgfmathcalc.code.tex[/tt] e [tt]pgfmathfloat.code.tex[/tt]. Continua ad aprire i vari files come prima; ad esempio, a te serve [tt]pgfmathcalc.code.tex[/tt]:
`
gedit $(kpsewhich pgfmathcalc.code.tex)
` E così via.
Ciao
Claudio