Progetto di I.U.M. Modellazione Geometrica

Alternativa 3: Algoritmo di Jarvis

Funzione principale

Parametri di ingresso

Parametri di uscita

Variabili locali

Pseudocodice

Algorithm Jarvis(input: points, output: hull)
 begin
    bottom = punto di ordinata minima in points;
    top = punto di ordinata massima in points;   
    hull = lista vuota;
    current = bottom;
    repeat 
      current = NextHullPointUp(current,points);
      aggiungi current alla lista hull;
    until (current==top);
    repeat 
      current = NextHullPointDown(current,points);
      aggiungi current alla lista hull;
    until (current==bottom);
 end
Dove vengono usate le funzioni ausiliarie NextHullPointUp e NextHullPointDown, che sono dettagliate piu' avanti.

Ricerca del prossimo punto

Abbiamo due funzioni: Dettagliamo la funzione NextHullPointUp.

Parametri di ingresso

Parametri di uscita

Variabili locali

Pseudocodice della procedura di ricerca

Procedure NextHullPointUp(input: start, point, output: next)
begin
  next = scorri l'insieme points dall'inizio fino a trovare un 
         punto con ordinata maggiore di start oppure con ordinata
         uguale ed ascissa minore di start;
  p = next;
  repeat
  begin  
     p = scorri l'insieme points dalla posizione dopo next fino a
         trovare un punto con ordinata maggiore di start oppure con
         ordinata uguale ed ascissa minore di start;
     if p esiste then
     begin
       controlla la terna (start, next, p);
       if (svoltano a destra) OR 
          ( (sono allineati) AND 

            (dist(next,start)<dist(p,start)) )
       then next = p;
     end if
  end
  while l'insieme points non e' stato esaminato tutto
  return next;
end
La funzione dist(...) calcola la distanza tra due punti.
La procedura NextHullPointDown si comporta in modo analogo ma

Strutture dati ed operazioni ausiliarie

E' necessaria una lista linkata di punti per rappresentare il risultato finale hull.

Su tale lista sono necessarie almeno le operazioni:

Notare che, non essendo necessaria la cancellazione di elementi dalla lista, la lista puo' essere semplicemente linkata (non bidirezionalie). Per supportare efficientemente l'aggiunta di un punto in coda e' necessario l'uso di un puntatore alla coda della lista.

La struttura dati per l'insieme points puo' essere un array.

Se si implementa l'insieme points ad array, nella lista possono essere memorizzati gli indici dei corrispondenti punti anziche' i punti stessi.

Primitive fondamentali sono il calcolo dell'orientamento di una terna di punti che avete implementato nell'esercitazione guidata. [BINARY]