Skip to main content

Implementazione dell'ambiente di simulazione

L'Environment è implementato a partire da un trait EnvironmentParameters che definisce i parametri dell'ambiente, quali:

  • dimensioni dell'ambiente;
  • entità presenti nell'ambiente;
  • lightField per ottenere informazioni su un campo di luce nell'ambiente.

Le informazioni sulla luce sono calcolate solo se necessario, grazie a un sistema di lazy evaluation che evita calcoli inutili.

DSL

Per la creazione dell'ambiente è possibile utilizzare un Domain Specific Language (DSL) che semplifica la definizione delle proprietà dell'ambiente e delle entità in esso contenute.

infix def withWidth(width: Int): Environment

infix def withHeight(height: Int): Environment

def withHighPrecisionLighting: Environment

def withFastLighting: Environment

def withDefaultLighting: Environment

infix def containing(entities: Set[Entity]): Environment

infix def containing(entity: Entity): Environment

infix def and(entity: Entity): Environment

infix def validate: Validation[ValidEnvironment]
Esempio di creazione di un ambiente
environment withWidth 10 withHeight 10 containing robot and obstacle and light

Allo stesso modo, il DSL rende più semplice la gestione della configurazione dell'ambiente, come mostrato nella sezione Gestione della configurazione.

Gestione della validazione

La validazione dell'ambiente e delle entità al suo interno sfruttano il package io.github.srs.model.validation che fornisce strumenti per la definizione di regole di validazione e per l'applicazione di queste alle entità presenti nell'ambiente. All'interno di Environment le regole sono applicate tramite la funzione validate:

infix def validate: Validation[ValidEnvironment] =
val entities = env.entities.filterNot:
case _: Boundary => true
case _ => false
val boundaries = Boundary.createBoundaries(env.width, env.height)
for
width <- bounded(s"$Self width", env.width, MinWidth, MaxWidth, includeMax = true)
height <- bounded(s"$Self height", env.height, MinHeight, MaxHeight, includeMax = true)
_ <- bounded(s"$Self entities", entities.size, 0, MaxEntities, includeMax = true)
entities <- withinBounds(s"$Self entities", entities, width, height)
entities <- noCollisions(s"$Self entities", entities ++ boundaries)
_ <- entities.toList.traverse_(validateEntity)
yield ValidEnvironment.from(env.copy(entities = entities))

In questo modo si vanno a controllare le dimensioni dell'ambiente, oltre alla posizione delle entità al suo interno e alla presenza di eventuali collisioni tra di esse. Si garantisce poi la validità di tutte le entità presenti nell'ambiente, assicurando che rispettino le regole di dominio definite.

Se le regole sono rispettate viene quindi creato un ValidEnvironment che rappresenta l'ambiente di simulazione corretto. Questo tipo viene utilizzato all'interno del motore di simulazione per garantire che solo ambienti validi vengano utilizzati durante la simulazione. Inoltre è utilizzato durante la gestione della configurazione realizzata dall'utente, per garantire che le configurazioni siano sempre valide e coerenti con le regole di dominio.

info

Per maggiori dettagli sulla validazione di dominio, si rimanda alla sezione Validazione di dominio.