2 Taglio della vegetazione - Intro Page - Università degli Studi di ...

2 Taglio della vegetazione - Intro Page - Università degli Studi di ... 2 Taglio della vegetazione - Intro Page - Università degli Studi di ...

dimec.unige.it
from dimec.unige.it More from this publisher
31.05.2013 Views

'Resituisce il massimo tra i valori di una matrice Function max(ByVal matrice As Array) As Integer Dim i, j, m As Integer m = matrice(0, 0) 'Inizializza il valore massimo con il valore del primo elemento For i = 0 To matrice.GetUpperBound(0) 'Le funzioni GetUpperBound rendono la funzione applicabile a tutte le matrici bidimensionali For j = 0 To matrice.GetUpperBound(1) If matrice(i, j) > m Then m = matrice(i, j) 'Se il valore è maggiore del massimo precedente viene salvato come nuovo massimo Next Next Return m 'Resituisce il valore massimo End Function 'Utilizza il metodo bouble sort per odinare una lista bidimensionale secondo i vaklori della seconda riga conservando le loro corrispondenze con i valori della prima riga Function SortList( ByRef ListaDir As Array) Dim Change As Boolean = True 'Inizializza l'indice di avvenuto cambiamento Dim Indice, TempSomma, TempDir As Integer Do While Change 'Itera finché ci sono scambi tra elementi Change = False For Indice = 1 To ListaDir.Length / 2 - 1 'Esegue il controlo su tutti gli elementi della seconda riga lista If ListaDir(1, Indice - 1) < ListaDir(1, Indice) Then 'Se un valore della seconda riga è maggiore del precedente li scambia e scambia anche quelli corrispondentti sulla prim riga TempDir = ListaDir(0, Indice - 1) 'Si usano delle variabili temporaee TempSomma = ListaDir(1, Indice - 1) ListaDir(0, Indice - 1) = ListaDir(0, Indice) ListaDir(1, Indice - 1) = ListaDir(1, Indice) ListaDir(0, Indice) = TempDir ListaDir(1, Indice) = TempSomma Change = True 'L'indice di avvenuto cambiamento è impostato su Vero End If Next Loop End Function 'Applica la Regola 1 Function Reg1() As Array Dim DirMat(1, 3) As Integer 'Inizializza la lista con le direzioni e i pesi del quadrato adiacente corrispondente 'Dim ListaDir As Array DirMat(0, 0) = 0 DirMat(0, 1) = 1 DirMat(0, 2) = 2 DirMat(0, 3) = 3 DirMat(1, 0) = Nord() 'Nella direzione Nord mette il valore del quadrato a Nord 155

DirMat(1, 1) = Sud() 'Nella direzione Nord mette il valore del quadrato a Sud DirMat(1, 2) = Ovest() 'Nella direzione Nord mette il valore del quadrato a Ovest DirMat(1, 3) = Est() 'Nella direzione Nord mette il valore del quadrato a Est Return BestOf(DirMat) 'Resituisc la lista con solo le direzioni con peso maggiore End Function 'Indirizza il robot verso il punto non verificato più vicino Function Reg5() As Byte Dim i, j, DistH, DistV, DistMin As Integer Dim Direzione, DirScelta As Byte Dim ListaDir(1, 0) As Integer Dim DistLinMin As Integer DistMin = r + c 'Inizializza la distanza minima con i lmassimo valore che essa può assumere DistLinMin = 0 For i = 0 To r 'Controlla tutti i punti su tutte le righe... For j = 0 To c '... e le colonne If MatriceCampo(i, j) > 0 Then 'Se il punto in questione deve essere ancora controllato Dim DimListaDir As Integer = -1 'Inizializza la dimensione minima della lista dei punti ammissibili ponendone la dimensione a -1 perché essa andrà comunque incrementata ReDim ListaDir(1, 0) 'Ridimensioa la lista delle direzioni DistV = i - Ratt 'Calcola la distanza in verticale DistH = j - Catt 'Calcola la distanza in orizzontale If Math.Abs(DistH) + Math.Abs(DistV) = 0 And DistV > 0 Then 'Se il punto è a Sud... DimListaDir += 1 'Incrementa la dimensione della lista delle direzioni da seguire ReDim Preserve ListaDir(1, DimListaDir) 'Ridimensiona la lista delle direzioni preservandone gli elementi ListaDir(0, 0) = 1 'Inserisce la direzione ListaDir(1, 0) = DistV 'Inserisce la distanza nella direzione corrispondente End If If Ovest() >= 0 And DistH < 0 Then 'Se il punto è a Ovest... DimListaDir += 1 'Incrementa la dimensione della lista delle direzioni da seguire ReDim Preserve ListaDir(1, DimListaDir) 'Ridimensiona la lista delle direzioni preservandone gli elementi ListaDir(0, 0) = 2 'Inserisce la direzione ListaDir(1, 0) = -DistH 'Inserisce la distanza nella direzione corrispondente End If 156

DirMat(1, 1) = Sud() 'Nella <strong>di</strong>rezione Nord mette il valore del quadrato a Sud<br />

DirMat(1, 2) = Ovest() 'Nella <strong>di</strong>rezione Nord mette il valore del quadrato a Ovest<br />

DirMat(1, 3) = Est() 'Nella <strong>di</strong>rezione Nord mette il valore del quadrato a Est<br />

Return BestOf(DirMat) 'Resituisc la lista con solo le <strong>di</strong>rezioni con peso maggiore<br />

End Function<br />

'In<strong>di</strong>rizza il robot verso il punto non verificato più vicino<br />

Function Reg5() As Byte<br />

Dim i, j, DistH, DistV, DistMin As Integer<br />

Dim Direzione, DirScelta As Byte<br />

Dim ListaDir(1, 0) As Integer<br />

Dim DistLinMin As Integer<br />

DistMin = r + c 'Inizializza la <strong>di</strong>stanza minima con i lmassimo valore che essa può assumere<br />

DistLinMin = 0<br />

For i = 0 To r 'Controlla tutti i punti su tutte le righe...<br />

For j = 0 To c '... e le colonne<br />

If MatriceCampo(i, j) > 0 Then 'Se il punto in questione deve essere ancora controllato<br />

Dim DimListaDir As Integer = -1 'Inizializza la <strong>di</strong>mensione minima <strong>della</strong> lista dei punti<br />

ammissibili ponendone la <strong>di</strong>mensione a -1 perché essa andrà comunque incrementata<br />

ReDim ListaDir(1, 0) 'Ri<strong>di</strong>mensioa la lista delle <strong>di</strong>rezioni<br />

DistV = i - Ratt 'Calcola la <strong>di</strong>stanza in verticale<br />

DistH = j - Catt 'Calcola la <strong>di</strong>stanza in orizzontale<br />

If Math.Abs(DistH) + Math.Abs(DistV) = 0 And DistV > 0 Then 'Se il punto è a Sud...<br />

DimListaDir += 1 'Incrementa la <strong>di</strong>mensione <strong>della</strong> lista delle <strong>di</strong>rezioni da seguire<br />

ReDim Preserve ListaDir(1, DimListaDir) 'Ri<strong>di</strong>mensiona la lista delle <strong>di</strong>rezioni<br />

preservandone gli elementi<br />

ListaDir(0, 0) = 1 'Inserisce la <strong>di</strong>rezione<br />

ListaDir(1, 0) = DistV 'Inserisce la <strong>di</strong>stanza nella <strong>di</strong>rezione corrispondente<br />

End If<br />

If Ovest() >= 0 And DistH < 0 Then 'Se il punto è a Ovest...<br />

DimListaDir += 1 'Incrementa la <strong>di</strong>mensione <strong>della</strong> lista delle <strong>di</strong>rezioni da seguire<br />

ReDim Preserve ListaDir(1, DimListaDir) 'Ri<strong>di</strong>mensiona la lista delle <strong>di</strong>rezioni<br />

preservandone gli elementi<br />

ListaDir(0, 0) = 2 'Inserisce la <strong>di</strong>rezione<br />

ListaDir(1, 0) = -DistH 'Inserisce la <strong>di</strong>stanza nella <strong>di</strong>rezione corrispondente<br />

End If<br />

156

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!