Tikz – Convex hull

  • Creatore
    Topic
  • #87465
    Up
    0
    Down
    ::


    Ciao vorrei riprodurre il disegno che allego usando tikz, ma non so come disegnare quegli insiemi, nè come prendere le tangenti!

    In realtà non mi interessa la forma specifica degli insiemi (purchè siano concavi), quindi avevo cercato ‘convex hull tikz’ in rete, ma non ho trovato nulla che facesse al caso mio.

    Grazie.

    edit: ma l’allegato si vede? l ho messo più volte

Visualizzazione 8 filoni di risposte
  • Autore
    Risposte
    • #87466
      Up
      0
      Down
      ::

      DirkPitt” post=86930Ciao vorrei riprodurre il disegno che allego usando tikz, ma non so come disegnare quegli insiemi, nè come prendere le tangenti!

      In realtà non mi interessa la forma specifica degli insiemi (purchè siano concavi), quindi avevo cercato ‘convex hull tikz’ in rete, ma non ho trovato nulla che facesse al caso mio.

      Grazie.

      edit: ma l’allegato si vede? l ho messo più volte

      No, l’allegato non si vede (c’è un limite alla dimensione del file da allegare, meglio se includi un’immagine) 🙂

      Comunque, cercando su google [tt]tikz convex hull[/tt] escono tutti i risultati giusti; dico giusti perché se vuoi una froma concava e cerchi convex hull difficilmente otterrai quello che desideri. Per fare prima, i risultati con convex hull sono essenzialmente due:
      1): padded boundary of convex hull
      2): Hobby path realization in convex hull approach
      La seconda versione disegna una forma “liquida” utilizzando l’algoritmo di Hobby per collegare i punti. Entrambe sono soluzioni automatiche: ti basta dare un elenco di nodi attorno a cui disegnare la forma.

      Ciao
      Claudio

    • #87467
      Up
      0
      Down
      ::

      cfiandra” post=86933

      Ciao vorrei riprodurre il disegno che allego usando tikz, ma non so come disegnare quegli insiemi, nè come prendere le tangenti!

      In realtà non mi interessa la forma specifica degli insiemi (purchè siano concavi), quindi avevo cercato ‘convex hull tikz’ in rete, ma non ho trovato nulla che facesse al caso mio.

      Grazie.

      edit: ma l’allegato si vede? l ho messo più volte

      No, l’allegato non si vede (c’è un limite alla dimensione del file da allegare, meglio se includi un’immagine) 🙂

      Comunque, cercando su google [tt]tikz convex hull[/tt] escono tutti i risultati giusti; dico giusti perché se vuoi una froma concava e cerchi convex hull difficilmente otterrai quello che desideri. Per fare prima, i risultati con convex hull sono essenzialmente due:
      1): padded boundary of convex hull
      2): Hobby path realization in convex hull approach
      La seconda versione disegna una forma “liquida” utilizzando l’algoritmo di Hobby per collegare i punti. Entrambe sono soluzioni automatiche: ti basta dare un elenco di nodi attorno a cui disegnare la forma.

      Ciao
      Claudio

      Ma l’allegato è un immagine png da 30 Kb !
      Comunque avevo visto quegli esempi, solo che io devo disegnare il “convex hull” di due insiemi (sarebbe il convex hull della loro unione). Senza immagine non riesco a spiegarmi meglio 🙁

    • #87468
      Up
      0
      Down
      ::

      DirkPitt” post=86934Ma l’allegato è un immagine png da 30 Kb !
      Comunque avevo visto quegli esempi, solo che io devo disegnare il “convex hull” di due insiemi (sarebbe il convex hull della loro unione). Senza immagine non riesco a spiegarmi meglio 🙁

      Magari è il formato.. non hai detto quale sia. Comunque puoi sempre caricarla su Dropbox o imgur e condividere qui il link.

      Ciao
      Claudio

    • #87469
      Up
      0
      Down
      ::


      Il formato è png l’avevo scritto e non è possibile che non è accettato dal forum 🙂 Eccola! http://imgur.com/9dUrelp

    • #87470
      Up
      0
      Down
      ::

      DirkPitt” post=86936Il formato è png l’avevo scritto e non è possibile che non è accettato dal forum 🙂 Eccola! http://imgur.com/9dUrelp

      Si, scusa, leggendo veloce non avevo notato il png. Sappi comunque, che recenti versioni di firefox non permettono di sfruttare la funzione allegati. Sono mesi che mi succede: a casa avevo risolto con Web Chrominium (avevo Ubuntu), ora che si è ripresentato mi arrengerò provando con Safari.

      Tornando al problema, al momento posso dirti che algoritmo userei io.

      1) piazzerei dei nodi, invisibili, sul piano in modo tale che sfruttando la versione Hobby-based le forme ottenute assomiglino a quelle dell’immagine.

      Sorge un problema: è necessario poter piazzare dei marcatori sul segmento, altrimenti in seguito non potrai disegnare agevolmente i segmenti. Purtroppo, proprio recentemente Andrew mi ha detto che Hobby non era in grado di piazzare nodi mentre si definisce un segmento. Cosa non proprio vera, vedi http://chat.stackexchange.com/transcript/message/10275360#10275360. Serve un minimo di dimestichezza con le decorazioni.

      2) sfruttando quello stile, inserirei dei nodi di tipo coordinate come opzioni dei segmenti in [tt]\hobbyconvexpath[/tt] (se si chiama così 😀 ): è necessario che questi nodi abbiano dei nomi univoci.

      3) a questo punto si possono disegnare i segmenti di intersezione: poichè i marcatori sono univocamente definiti, potrai usare la sintassi semplice `\draw (A)–(B)` per collegare il punto A dell’insieme a sinistra con il punto B dell’insieme a destra.

      Non è banale, ma si può fare 😉

      Ciao
      Claudio

    • #87471
      Up
      0
      Down
      ::

      cfiandra” post=86947

      Il formato è png l’avevo scritto e non è possibile che non è accettato dal forum 🙂 Eccola! http://imgur.com/9dUrelp

      Si, scusa, leggendo veloce non avevo notato il png. Sappi comunque, che recenti versioni di firefox non permettono di sfruttare la funzione allegati. Sono mesi che mi succede: a casa avevo risolto con Web Chrominium (avevo Ubuntu), ora che si è ripresentato mi arrengerò provando con Safari.

      Tornando al problema, al momento posso dirti che algoritmo userei io.

      1) piazzerei dei nodi, invisibili, sul piano in modo tale che sfruttando la versione Hobby-based le forme ottenute assomiglino a quelle dell’immagine.

      Sorge un problema: è necessario poter piazzare dei marcatori sul segmento, altrimenti in seguito non potrai disegnare agevolmente i segmenti. Purtroppo, proprio recentemente Andrew mi ha detto che Hobby non era in grado di piazzare nodi mentre si definisce un segmento. Cosa non proprio vera, vedi http://chat.stackexchange.com/transcript/message/10275360#10275360. Serve un minimo di dimestichezza con le decorazioni.

      2) sfruttando quello stile, inserirei dei nodi di tipo coordinate come opzioni dei segmenti in [tt]\hobbyconvexpath[/tt] (se si chiama così 😀 ): è necessario che questi nodi abbiano dei nomi univoci.

      3) a questo punto si possono disegnare i segmenti di intersezione: poichè i marcatori sono univocamente definiti, potrai usare la sintassi semplice `\draw (A)–(B)` per collegare il punto A dell’insieme a sinistra con il punto B dell’insieme a destra.

      Non è banale, ma si può fare 😉

      Ciao
      Claudio

      Grazie per l’aiuto 🙂 Onestamente speravo fosse più semplice. Forse, a questo punto, mi conviene disegnare il bordo dell’insieme “attaccando” dei pezzi di funzioni note in modo che la curva risultante sia continua e chiusa, no? Se creo un paio di axis diciamo con dominio 0

    • #87472
      Up
      0
      Down
      ::

      DirkPitt” post=86949Grazie per l’aiuto 🙂 Onestamente speravo fosse più semplice. Forse, a questo punto, mi conviene disegnare il bordo dell’insieme “attaccando” dei pezzi di funzioni note in modo che la curva risultante sia continua e chiusa, no? Se creo un paio di axis diciamo con dominio 0

      Secondo me quel sistema è addirittura più complicato del mio. Appena ho tempo approfondisco.

      Ciao
      Claudio

    • #87473
      Up
      0
      Down
      ::

      cfiandra” post=86963

      Grazie per l’aiuto 🙂 Onestamente speravo fosse più semplice. Forse, a questo punto, mi conviene disegnare il bordo dell’insieme “attaccando” dei pezzi di funzioni note in modo che la curva risultante sia continua e chiusa, no? Se creo un paio di axis diciamo con dominio 0

      Secondo me quel sistema è addirittura più complicato del mio. Appena ho tempo approfondisco.

      Ciao
      Claudio

      Ah ok grazie 🙂 Spero, però, che tu abbia già inteso che la mia è la voce dell’ignoranza in materia, quindi non l ho proposto perchè certo che fosse più facile 😀

      Ciao!

    • #87474
      Up
      0
      Down
      ::

      DirkPitt” post=86996

      [quote=”DirkPitt” post=86949]Grazie per l’aiuto 🙂 Onestamente speravo fosse più semplice. Forse, a questo punto, mi conviene disegnare il bordo dell’insieme “attaccando” dei pezzi di funzioni note in modo che la curva risultante sia continua e chiusa, no? Se creo un paio di axis diciamo con dominio 0

      Secondo me quel sistema è addirittura più complicato del mio. Appena ho tempo approfondisco.

      Ciao
      Claudio

      Ah ok grazie 🙂 Spero, però, che tu abbia già inteso che la mia è la voce dell’ignoranza in materia, quindi non l ho proposto perchè certo che fosse più facile 😀

      Ciao![/quote]
      Perdona il ritardo per prima cosa 🙂

      Dunque, la soluzione che avevo in mente non è proprio perfetta; credo che sarebbe meglio posizionare i nodi come dicevo, ma poi tracciare a mano le curve come in Highlighting some nodes of a TikZ binomial tree.

      Con hobby, invece, mi ero scordato che l’algoritmo automatico traccia dei control points a metà di ogni coppia di nodi e nel tuo caso non va sempre bene. Ecco un esempio di cosa avevo in mente: `
      \documentclass[a4paper,12pt]{article}

      \usepackage{tikz}
      \usetikzlibrary{calc,decorations.markings,hobby}

      % versione TeXLive 2013 compatibile 2012:
      % http://tex.stackexchange.com/questions/121286/error-with-hobbyconvexpath

      \newcommand{\hobbyconvexpath}[2]{
      [
      create hobbyhullnodes/.code={
      \global\edef\namelist{#1}
      \foreach [count=\counter] \nodename in \namelist {
      \global\edef\numberofnodes{\counter}
      \node at (\nodename)
      [draw=none,name=hobbyhullnode\counter] {};
      }
      \node at (hobbyhullnode\numberofnodes)
      [name=hobbyhullnode0,draw=none] {};
      \pgfmathtruncatemacro\lastnumber{\numberofnodes+1}
      \node at (hobbyhullnode1)
      [name=hobbyhullnode\lastnumber,draw=none] {};
      },
      create hobbyhullnodes
      ]
      ($(hobbyhullnode1)!#2!-90:(hobbyhullnode0)$)
      \pgfextra{
      \gdef\hullpath{}
      \foreach [
      evaluate=\currentnode as \previousnode using int(\currentnode-1),
      evaluate=\currentnode as \nextnode using int(\currentnode+1)
      ] \currentnode in {1,…,\numberofnodes} {
      \ifnum\currentnode=1\relax
      \xdef\hullpath{([closed=true]$(hobbyhullnode\currentnode)!#2!180:(hobbyhullnode\previousnode)$)
      ..($(hobbyhullnode\nextnode)!0.5!(hobbyhullnode\currentnode)$)}
      \else
      \xdef\hullpath{\hullpath
      ..($(hobbyhullnode\currentnode)!#2!180:(hobbyhullnode\previousnode)$)
      ..($(hobbyhullnode\nextnode)!0.5!(hobbyhullnode\currentnode)$)}
      \fi
      \ifx\currentnode\numberofnodes
      \else
      \xdef\hullpath{\hullpath
      ..($(hobbyhullnode\nextnode)!#2!-90:(hobbyhullnode\currentnode)$)}
      \fi
      }
      }
      \hullpath
      }

      \tikzset{insert node/.style args={#1 at #2}{
      postaction=decorate,
      decoration={
      markings,
      mark= at position #2
      with
      {
      #1
      }
      }
      }
      }

      \begin{document}

      \begin{tikzpicture}[use Hobby shortcut
      ]

      \draw[-stealth] (-5,0)–(5,0);
      \draw[-stealth] (0,-5)–(0,5);

      % S2
      \node (a) at (-0.75,-0.5) {};
      \node (b) at (-4,-1) {};
      \node (c) at (-4.75,1.5) {};
      \node (d) at (-2.45,3) {};

      \draw[fill=gray!20,insert node={
      \node[coordinate](first-a){};} at 0.23,
      insert node={
      \node[coordinate](first-b){};} at 0.68
      ]
      \hobbyconvexpath{a,b,c,d}{12.5pt};

      % S1
      \node (e) at (2,-3) {};
      \node (f) at (1,1) {};
      \node (g) at (2.5,1.5) {};
      \node (h) at (4.25,0.5) {};

      \draw[fill=gray!20,insert node={
      \node[coordinate](second-a){};} at 0.01,
      insert node={
      \node[draw](second-b){};} at 0.475,
      insert node={
      \node[coordinate](second-c){};} at 0.7,
      insert node={
      \node[coordinate](second-d){b};} at 0.95,
      ]
      \hobbyconvexpath{e,f,g,h}{12.5pt};

      \draw(first-a)–(second-a);
      \draw(first-b)–(second-b);
      \draw(second-c)–(second-d);

      \end{tikzpicture}
      \end{document}
      ` Quello che invece dovrebbe tornerti utile anche nel caso di definizione a mano del segmento è il comodissimo (o per lo meno io lo reputo tale) [tt]insert node[/tt].

      Ciao
      Claudio

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

Go to top