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

'Controlla che il punto di partenza scelto non sia circondato da valori negativi del campo, non sia cioè un punto morto. If ListaDirezioni(1, 0) < 0 Then PuntoBuono = False Exit Do End If If ListaDirezioni.Length > 2 Or ListaDirezioni(1, 0) = 0 Then 'Elabora le regole successive solo nel caso di ambiguità, se cioè non c'è una scelta univoca da parte della Regola 1 'Regola2: Siccome per il motocoltivatore è gravoso cambiare direzione, in caso di indecisio ne il robot prova a procedere dritto Pres = Cerca(ListaDirezioni, OldDir) 'Cerca nella lista delle direzioni ammissibile quella che sta già percorrendo If Pres 2 Or ListaDirezioni(1, 0) = 0 Then 'Nel caso ci siano due direzioni ugualmente buone 'Regola4: Si dirige nel semipiano la cui soma dei valori ha valore maggiore SumSem(ListaDirezioni) 'Calcola la somma dei semipiani rispetto alla posizione attuale ListaDirezioni = BestOf(ListaDirezioni) 'Sceglie la direzione (o le direzioni, in caso di ambiguità) migliori If ListaDirezioni.Length > 2 Then 'Nel caso sussista ancora un'ambiguità... 'Regola 5: l robot si dirige verso il punto non controllato (>0) più vicino alla sua posizione NewDir = Reg5() 'N.B. In caso di due distanze uguali prende semplicemente la prima Else NewDir = ListaDirezioni(0, 0) 'Aggiorna la direzione secondo la Regola 4 End If Else NewDir = ListaDirezioni(0, 0) 'Aggiorna la direzione secondo la Regola 3 End If Else NewDir = OldDir 'Aggiorna la direzione secondo la Regola 2 End If Else NewDir = ListaDirezioni(0, 0) 'Aggiorna la dirzione secondo la Regola 1 End If 149

'Se è in circolo vizioso esce in modo casuale If NewDir = Old2Dir And IsOpposit(OldDir, NewDir) Then 'Nel caso la nuova direzione sia opposta alla vecchia e uguale a quella di due step prima (il robot va avanti e indietro in circolo vizioso)... NewDir = Casual() 'Sceglie una direzione casuale per uscire dal circolo vizioso End If If NewDir OldDir Then Curve += 1 'Se il valore della direzione è cambiato incrementa il contatore delle curve Old2Dir = OldDir 'Aggiorna il valore della direzione di due step precedenti OldDir = NewDir 'Aggiorna il valore della direzione precedente Draw(Me) 'Disegna la form 'Aggiorna la posizione Select Case NewDir Case 0 'Il Robot è andato verso Nord Ratt -= 1 'Decremente l'indice di riga Case 1 'Il Robot è andato verso Sud Ratt += 1 'Incrementa l'indice di riga Case 2 'Il Robot è andato verso Ovest Catt -= 1 'Decrementa l'indice di colonna Case 3 'Il Robot è andato verso Est Catt += 1 'Incrementa l'indice di colonna End Select MatriceCampo(Ratt, Catt) = 0 'Segna come controllato il quadrato su cui si trova il robot Spostamenti += 1 'Incrementa l'indice degli spostamenti Campo.FillRectangle(Quad_Actual, 8 + 5 * Catt, 32 + 5 * Ratt, 5, 5) 'Disegna il quadrato su cui si trova il robot al momento 'Blocco "perditempo" che tiene conto dei tempi di aggiornamento dell'immagine If r * c < 1000 Then 'Interviene solo per MatriciCampo piccole (meno di 1000 elementi) For Time = 0 To 10000000 Math.Sqrt(Time) 'Esegue un calcolo ozioso Next End If 'Aggiornamento dei dati significativi Application.DoEvents() 'Porta la Form in primo piano e la attiva in modo da poterne schiacciare i bottoni Me.lblMovements.Text = CStr(Spostamenti) 'Aggiorna il valore della casella di testo che visualizza gli spostamenti Me.lblRotations.Text = CStr(Curve) 'Aggiorna il valore della casella di testo che visualizza le curve Me.lblTime.Text = CStr(Math.Round(Curve * TCurva + Spostamenti / Velocità)) 'Aggiorna il valore del tempo in base a velocità, spostamenti e curve 150

'Controlla che il punto <strong>di</strong> partenza scelto non sia circondato da valori negativi del<br />

campo, non sia cioè un punto morto.<br />

If ListaDirezioni(1, 0) < 0 Then<br />

PuntoBuono = False<br />

Exit Do<br />

End If<br />

If ListaDirezioni.Length > 2 Or ListaDirezioni(1, 0) = 0 Then 'Elabora le regole<br />

successive solo nel caso <strong>di</strong> ambiguità, se cioè non c'è una scelta univoca da parte <strong>della</strong> Regola 1<br />

'Regola2: Siccome per il motocoltivatore è gravoso cambiare <strong>di</strong>rezione, in caso <strong>di</strong><br />

indecisio ne il robot prova a procedere dritto<br />

Pres = Cerca(ListaDirezioni, OldDir) 'Cerca nella lista delle <strong>di</strong>rezioni ammissibile<br />

quella che sta già percorrendo<br />

If Pres 2 Or ListaDirezioni(1, 0) = 0 Then 'Nel caso ci siano<br />

due <strong>di</strong>rezioni ugualmente buone<br />

'Regola4: Si <strong>di</strong>rige nel semipiano la cui soma dei valori ha valore maggiore<br />

SumSem(ListaDirezioni) 'Calcola la somma dei semipiani rispetto alla posizione<br />

attuale<br />

ListaDirezioni = BestOf(ListaDirezioni) 'Sceglie la <strong>di</strong>rezione (o le <strong>di</strong>rezioni, in<br />

caso <strong>di</strong> ambiguità) migliori<br />

If ListaDirezioni.Length > 2 Then 'Nel caso sussista ancora un'ambiguità...<br />

'Regola 5: l robot si <strong>di</strong>rige verso il punto non controllato (>0) più vicino alla<br />

sua posizione<br />

NewDir = Reg5() 'N.B. In caso <strong>di</strong> due <strong>di</strong>stanze uguali prende semplicemente<br />

la prima<br />

Else<br />

NewDir = ListaDirezioni(0, 0) 'Aggiorna la <strong>di</strong>rezione secondo la Regola 4<br />

End If<br />

Else<br />

NewDir = ListaDirezioni(0, 0) 'Aggiorna la <strong>di</strong>rezione secondo la Regola 3<br />

End If<br />

Else<br />

NewDir = OldDir 'Aggiorna la <strong>di</strong>rezione secondo la Regola 2<br />

End If<br />

Else<br />

NewDir = ListaDirezioni(0, 0) 'Aggiorna la <strong>di</strong>rzione secondo la Regola 1<br />

End If<br />

149

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

Saved successfully!

Ooh no, something went wrong!