Skip to content

Riproduzione di una figura in tikz con testo e frecce che scorrono in cerchio

Abbiamo bisogno del tuo aiuto per condividere le nostre cronache riguardanti l'informatica.

Soluzione:

Ecco una versione aumentata della risposta di marmotta, come da sua richiesta.

Il miglioramento principale riguarda le punte delle frecce, che ora hanno angoli arrotondati.
Sto usando una punta di freccia personalizzata per questo, perché l'elemento Triangle[round,line width=0pt .1] è purtroppo scollegata dall'asta se la punta è relativamente piccola rispetto alla larghezza della linea (come in questo caso). (E anche perché marmot l'ha chiesto).

Le punte di freccia con angoli arrotondati possono essere dichiarate con pgfdeclarearrow impostando una larghezza di linea positiva con pgfsetlinewidth{}e chiamando pgfsetroundjoin e accarezzando il percorso che traccia la punta della freccia, oltre a riempirlo con pgfusepathqfillstroke. Questo si può vedere nel preambolo sottostante.
Maggiori informazioni sulla dichiarazione delle punte delle frecce si trovano nel manuale del pgf (§104.4 a p1093 al momento della stesura di questo articolo, §100.4 a p1017 prima del 05 gennaio 2019), ma io vorrei anche altamente raccomandare di dare un'occhiata alla fonte del arrows.meta per vedere alcuni esempi.

Ecco il risultato:

documentclass[tikz,border=2.718281828mm]{standalone}

usepackage{textgreek}
usetikzlibrary{decorations.text,arrows.meta,bending}

pgfdeclarearrow{
  name = mytriangle,
  parameters = { thepgfarrowlength, thepgfarrowwidth, thepgfarrowlinewidth, ifpgfarrowroundcap cfi },
  defaults = { length = 0pt .85, width = 0pt 1.3, line width = 0pt .1, round = true },
  setup code = {
    %% The different end values:
    pgfarrowssettipend{1pgfarrowlength}
    pgfarrowssetlineend{.2pgfarrowlength}
    pgfarrowssetvisualbackend{0pgfarrowlength}
    pgfarrowssetbackend{0pgfarrowwidth}
    %% The hull:
    pgfarrowshullpoint{1pgfarrowlength}{0pgfarrowwidth}
    pgfarrowsupperhullpoint{0pgfarrowlength}{.5pgfarrowwidth}
    %% Values that are used when drawing:
    pgfarrowssavethepgfarrowwidth
    pgfarrowssavethepgfarrowlength
    pgfarrowssavethepgfarrowlinewidth
  },
  drawing code = {
    ifpgfarrowroundcappgfsetroundjoinfi
    pgfsetlinewidth{pgfarrowlinewidth}
    pgfpathmoveto{pgfqpoint{1pgfarrowlength}{0pgfarrowwidth}}
    pgfpathlineto{pgfpoint{0pgfarrowlength}{.5pgfarrowwidth}}
    pgfpathlineto{pgfqpoint{0pgfarrowlength}{-.5pgfarrowwidth}}
    pgfpathclose
    pgfusepathqfillstroke
  },
}

definecolor{myred}{rgb}{.92,.26,.23}
definecolor{myyellow}{rgb}{.97,.69,.21}
definecolor{mygray}{rgb}{.54,.53,.55}
definecolor{mycyan}{rgb}{.38,.66,.65}
definecolor{myblue}{rgb}{.07,.24,.32}

begin{document}

begin{tikzpicture}
    newcommand*{LineWidth}{1.2cm}
    newcommand*{Radius}{3cm}
    %% Text:
    node[font=sffamilybfseries,scale=3.4,anchor=south,color=myblue] at (0,-0.1) {LEAN};
    node[font=sffamily,scale=6,anchor=north,color=myblue] at (0,0.5) {6textsigma};
    %% Arrows:
    foreach X [count=Y] in {myyellow,myred,myblue,mycyan,mygray} {
        draw[-mytriangle,line width=LineWidth,X,rotate=72*(Y-1)]
             (100:Radius) arc (100:5:Radius);
    }
    %% One arrowhead needs to be redrawn because it is covered
    draw[-mytriangle,line width=LineWidth,myyellow]
         (45:Radius) arc (45:5:Radius);
    %% Text on arrows:
    foreach X/reverse [count=Y] in {De{fi}ne/true,Control/true,Improve/false,Analyze/false,Measure/false} {
        path[rotate=72*(Y-1),decorate,decoration={text along path,text={|Largebfseries|X},
                raise=-2.5pt,text color=white,text align=center,reverse path=reverse}]
             (52-36:Radius) arc(52-36:52+36:Radius);
    }
end{tikzpicture}

end{document}

Output con freccia personalizzata

Si noti che ho usato la libreria reverse path per invertire "Define" e "Control" e sto usando il tasto rotate per ruotare le frecce di multipli di 72 º, invece di eseguire questi calcoli all'interno del tasto draw . Una punta di freccia è disegnata due volte perché forma un cerchio e quindi una di esse sarà sempre in basso.



Ecco una versione che utilizza la versione rotonda del comando Triangle della punta di freccia Triangle.
Poiché questa punta di freccia è parzialmente scollegata dalla sua asta se si estende solo un po' ai lati, sto disegnando le punte di freccia separatamente dalle aste, il che risolve anche il problema della sovrapposizione.

Il risultato è per lo più identico:

documentclass[tikz,border=2.718281828mm]{standalone}

usepackage{textgreek}
usetikzlibrary{decorations.text,arrows.meta,bending}

tikzset{mytriangle/.tip={Triangle[length = 0pt .95,width=0pt 1.45,round,line width=0pt .1]}}

definecolor{myred}{rgb}{.92,.26,.23}
definecolor{myyellow}{rgb}{.97,.69,.21}
definecolor{mygray}{rgb}{.54,.53,.55}
definecolor{mycyan}{rgb}{.38,.66,.65}
definecolor{myblue}{rgb}{.07,.24,.32}

begin{document}

begin{tikzpicture}
    newcommand*{LineWidth}{1.2cm}
    newcommand*{Radius}{3cm}
    %% Text:
    node[font=sffamilybfseries,scale=3.4,anchor=south,color=myblue] at (0,-0.1) {LEAN};
    node[font=sffamily,scale=6,anchor=north,color=myblue] at (0,0.5) {6textsigma};
    %% Arrow shafts:
    foreach X [count=Y] in {myyellow,myred,myblue,mycyan,mygray} {
        draw[line width=LineWidth,X,rotate=72*(Y-1)]
             (95:Radius) arc (95:20:Radius);
    }
    %% Arrowheads
    foreach X [count=Y] in {myyellow,myred,myblue,mycyan,mygray} {
        draw[-mytriangle,line width=LineWidth,X,rotate=72*(Y-1)]
             (35:Radius) arc (35:5:Radius);
    }
    %% Text on arrows:
    foreach X/reverse [count=Y] in {De{fi}ne/true,Control/true,Improve/false,Analyze/false,Measure/false} {
        path[rotate=72*(Y-1),decorate,decoration={text along path,text={|Largebfseries|X},
                raise=-2.5pt,text color=white,text align=center,reverse path=reverse}]
             (52-36:Radius) arc(52-36:52+36:Radius);

    }
end{tikzpicture}

end{document}

Output con triangolo arrotondato

È certamente possibile disegnare qualcosa di simile. (Non ho cercato di abbinare i colori. AGGIORNAMENTO: corretto l'orientamento del testo in basso, grazie a manooooh).

documentclass[tikz,border=3.14mm]{standalone}
usepackage{textgreek}
usetikzlibrary{decorations.text,arrows.meta,bending}
begin{document}
begin{tikzpicture}
newcommand{LineWidth}{10mm}
newcommand{Radius}{3cm}
node[font=sffamilybfseries,scale=3.4,anchor=south] at (0,-0.1) {LEARN};
node[font=sffamily,scale=6,anchor=north] at (0,0.5) {6textsigma};
foreach X [count=Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{draw[line width=LineWidth,X] ({90-(Y-1)*72}:Radius)
 arc({90-(Y-1)*72}:{90-(Y)*72}:Radius);}

foreach X [count=Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{draw[-{Triangle[bend,length={0.75*LineWidth},width={1.5*LineWidth}]},
line width=LineWidth,X] 
({90-(Y-0.5)*72}:Radius)
 arc({90-(Y-0.5)*72}:{90-(Y)*72-10}:Radius);}

foreach X [count=Y] in {Define,Measure,Analyze,Improve,Control} 
{ifnumY=3
fill[decoration={text along path, text={|Largebfseries| X},
  raise=-3pt,text color=white,text align=center},decorate] 
  ({90-(Y)*72}:Radius)
 arc({90-(Y)*72}:{90-(Y-1)*72}:Radius);
else
fill[decoration={text along path, text={|Largebfseries| X},
  raise=-3pt,text color=white,text align=center},decorate] 
  ({90-(Y-1)*72}:Radius)
 arc({90-(Y-1)*72}:{90-(Y)*72}:Radius);
fi }

end{tikzpicture}
end{document}

Immettere la descrizione dell'immagine qui

ADDENDUM PER DIVERTIMENTO: Stavo cercando di rendere rotondi gli angoli del percorso della freccia. Si possono progettare frecce arbitrarie con pgfdeclarearrowe la base del mio tentativo è l'esempio a pag. 1096 del manuale pgf. Tuttavia, non sono riuscito a rendere pgfsetcornersarced funzionare. (Se dovessi tirare a indovinare, probabilmente direi che questo è dovuto al fatto che gli esempi a pag. 1069 del manuale pgf usano pgfusepath{stroke}il cui analogo è pgfusepath{fill}. Tuttavia, questo non è consentito in una dichiarazione di freccia, dove si deve usare la versione rapida pgfusepathqfillche, in base a quanto ho trovato, ignora pgfsetcornersarced.) Ma @circumscribe ha una soluzione molto migliore, che copio spudoratamente qui. L'unico piccolo miglioramento (?) è che ho spostato i testi un po' più lontano dalle punte delle frecce, ma il merito va tutto a @circumscribe.

documentclass[tikz,border=3.14mm]{standalone}
usepackage{textgreek}
usetikzlibrary{decorations.text,arrows.meta,bending}
pgfdeclarearrow{
 name =rtriangle,
 parameters = { thepgfarrowlength },
  setup code = {
    % The different end values:
    pgfarrowssettipend{.25pgfarrowlength}
   pgfarrowssetlineend{-.25pgfarrowlength}
   pgfarrowssetvisualbackend{-.5pgfarrowlength}
   pgfarrowssetbackend{-.75pgfarrowlength}
% The hull
pgfarrowshullpoint{.5pgfarrowlength}{0pt}
pgfarrowshullpoint{-.5pgfarrowlength}{pgfarrowlength}
pgfarrowshullpoint{-.5pgfarrowlength}{-pgfarrowlength} % Saves: Only the length:
    pgfarrowssavethepgfarrowlength
  },
  drawing code = {
   pgfsetroundjoin
   pgfsetlinewidth{.2pgflinewidth}
   pgfpathmoveto{pgfqpoint{.5pgfarrowlength}{0pgfarrowlength}}
   pgfpathlineto{pgfpoint{-.5pgfarrowlength}{pgfarrowlength}}
   pgfpathlineto{pgfqpoint{-.5pgfarrowlength}{-pgfarrowlength}}
   pgfpathclose
   pgfusepathqfillstroke
},
 defaults = { length = 4cm }
}
begin{document}
begin{tikzpicture}
newcommand{LineWidth}{10mm}
newcommand{Radius}{3cm}
node[font=sffamilybfseries,scale=3.4,anchor=south] at (0,-0.1) {LEARN};
node[font=sffamily,scale=6,anchor=north] at (0,0.5) {6textsigma};
foreach X [count=Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{draw[line width=LineWidth,X] ({90-(Y-1)*72}:Radius)
arc({90-(Y-1)*72}:{90-(Y)*72}:Radius);}
%`,width={1.5*LineWidth}
foreach X [count=Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{draw[-{rtriangle[bend,length={0.65*LineWidth}]},
line width=LineWidth,X]
({90-(Y-0.5)*72}:Radius)
arc({90-(Y-0.5)*72}:{90-(Y)*72-10}:Radius);}

foreach X [count=Y] in {Define,Measure,Analyze,Improve,Control}
{ifnumY=3
fill[decoration={text along path, text={|Largebfseries| X},
 raise=-3pt,text color=white,text align=center},decorate]
 ({90-(Y)*72-5}:Radius)
arc({90-(Y)*72-5}:{90-(Y-1)*72-5}:Radius);
else
fill[decoration={text along path, text={|Largebfseries| X},
 raise=-3pt,text color=white,text align=center},decorate]
 ({90-(Y-1)*72-5}:Radius)
arc({90-(Y-1)*72-5}:{90-(Y)*72-5}:Radius);
fi }

end{tikzpicture}
end{document}

Immettere la descrizione dell'immagine qui

P.S. Per quanto riguarda la domanda se sia corretto "LEAN" o "LEARN", non lo so davvero. Tuttavia, "lean" non suona bene per le marmotte (una marmotta magra non sopravvive all'inverno). Quindi ho tenuto "imparare". 😉

Ricordati di comunicare questa notizia se ti è stata utile.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.