Una leggera introduzione al problema degli scafi convessi
Gli scafi convessi tendono ad essere utili in molti campi diversi, a volte in modo abbastanza inaspettato. In questo articolo, spiegherò l’idea di base degli scafi convessi 2d e come usare la scansione graham per trovarli. Quindi, se conoscete già la scansione di Graham, allora questo articolo non fa per voi, ma in caso contrario, questo dovrebbe familiarizzarvi con alcuni dei concetti rilevanti.
Il guscio convesso di un insieme di punti è definito come il più piccolo poligono convesso, che racchiude tutti i punti dell’insieme. Convesso significa che il poligono non ha angoli piegati verso l’interno.
I bordi rossi sul poligono di destra racchiudono l’angolo in cui la forma è concava, l’opposto di convessa.
Un modo utile per pensare allo scafo convesso è l’analogia dell’elastico. Supponiamo che i punti dell’insieme siano chiodi che spuntano da una superficie piatta. Immaginate ora cosa accadrebbe se prendeste un elastico e lo allungaste intorno ai chiodi. Cercando di contrarsi alla sua lunghezza originale, l’elastico racchiuderebbe i chiodi, toccando quelli che sporgono più lontano dal centro.
Per rappresentare la carena convessa risultante nel codice, di solito memorizziamo la lista dei punti che reggono questo elastico, cioè la lista dei punti sulla carena convessa.
Nota che abbiamo ancora bisogno di definire cosa dovrebbe accadere se tre punti giacciono sulla stessa linea. Se si immagina che l’elastico abbia un punto in cui tocca uno dei chiodi, ma non si piega affatto, ciò significa che il chiodo si trova su una linea retta tra altri due chiodi. A seconda del problema, potremmo considerare questo chiodo lungo la linea retta come parte dell’uscita, poiché tocca l’elastico. D’altra parte, potremmo anche dire che questo chiodo non dovrebbe far parte dell’output, perché la forma dell’elastico non cambia quando lo rimuoviamo. Questa decisione dipende dal problema su cui state lavorando, e soprattutto se avete un input in cui nessun punto è collineare (questo è spesso il caso nei compiti facili per le competizioni di programmazione) allora potete anche ignorare completamente questo problema.
Trovare lo scafo convesso
Guardando un insieme di punti, l’intuizione umana ci permette di capire rapidamente quali punti hanno la probabilità di toccare lo scafo convesso, e quali saranno più vicini al centro e quindi lontani dallo scafo convesso. Ma tradurre questa intuizione in codice richiede un po’ di lavoro.
Per trovare la carena convessa di un insieme di punti, possiamo usare un algoritmo chiamato Graham Scan, che è considerato uno dei primi algoritmi di geometria computazionale. Usando questo algoritmo, possiamo trovare il sottoinsieme di punti che giacciono sullo scafo convesso, insieme all’ordine in cui questi punti si incontrano quando si gira intorno allo scafo convesso.
L’algoritmo inizia con la ricerca di un punto, che sappiamo giace sicuramente sullo scafo convesso. Il punto con la coordinata y più bassa, per esempio, può essere considerato una scelta sicura. Se esistono più punti alla stessa coordinata y, prendiamo quello che ha la coordinata x più grande (questo funziona anche con altri punti d’angolo, ad esempio prima la x più bassa poi la y più bassa).
Leave a Reply