Re: un celebre disegno

#86685
Up
0
Down
::


Effettivamente c’è da diventare matti a scrivere tutto 😀

Ivan ha avuto l’intuizione giusta, ma credo che al giorno d’oggi trovare qualcuno che si metta ad imparare PGF sia difficile: è molto più macchinoso di TikZ che è nato appunto per essere un’interfaccia più user-friendly di PGF. Una piccola pecca al codice di Ivan è che genera si cerchi casualmente distribuiti, ma non su un cerchio: definendo infatti casualmente le coordinate x e y i punti si dispongono su un quadrato/rettangolo a seconda dei massimi consentiti.

Su TeX.SX ci sono un paio di interventi per problemi simili, ma sempre su rettangoli: qui e qui (nel secondo si tiene conto di come non far sovrapporre i cerchi).

Qui il problema è diverso: i cerchi devono essere distribuiti su un cerchio. Quindi serve una sintassi diversa per generare un angolo e una distanza dal centro: in questo modo si può scrivere `
\node[opzioni] at ($(inc.center)!\distanza!(inc.angolo)$){};` dove [tt]inc[/tt] è un nodo di tipo circle già esistente.

Ecco un esempio completo: `
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\tikzset{bianco_circle/.style={circle,minimum size=4cm, draw}}
\tikzset{_circle/.style={circle,minimum size=2cm, draw}}
\tikzset{green_circle/.style={circle,minimum size=0.1cm, draw,bottom color=green!80}}
\tikzset{red_circle/.style={circle,minimum size=0.1cm, draw,bottom color=red!80}}
\tikzset{blue_circle/.style={circle,minimum size=0.1cm, draw,bottom color=blue!80}}

\begin{tikzpicture}
\pgfmathsetseed{123456}
\node (inc) at (0,5) [bianco_circle,label=INCLUSIONE] {};

\foreach \circle in {1,…,10}{
\pgfmathrandom{0,360}
\pgfmathtruncatemacro\angle\pgfmathresult
\pgfmathrnd
\pgfmathsetmacro\distance\pgfmathresult
\node[green_circle] at ($(inc.center)!\distance!(inc.\angle)$){};
}

\foreach \circle in {1,…,10}{
\pgfmathrandom{0,360}
\pgfmathtruncatemacro\angle\pgfmathresult
\pgfmathrnd
\pgfmathsetmacro\distance\pgfmathresult
\node[red_circle] at ($(inc.center)!\distance!(inc.\angle)$){};
}

\foreach \circle in {1,…,10}{
\pgfmathrandom{0,360}
\pgfmathtruncatemacro\angle\pgfmathresult
\pgfmathrnd
\pgfmathsetmacro\distance\pgfmathresult
\node[blue_circle] at ($(inc.center)!\distance!(inc.\angle)$){};
}

\end{tikzpicture}

\end{document}
`

Dimenticavo: a parte l’uso dei cicli e numeri casuali per ridurre il numero di righe di codice, altri miglioramenti riguardano come hai scritto le opzioni. Abituati ad usare tikzset e non tikzstyle che oltre ad essere non raccomandato è più pericoloso perché è più facile da modificare: se copiando ed incollando ti scappa un solo + rischi di sovrascrivere uno stile. Con tikzset è più difficile fare questi pasticci.

Altra cosa: non c’è motivo di specificare cose come [tt]shapes=[/tt] o [tt]=black[/tt]. Sono predefinite.

Ciao
Claudio

Go to top