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]
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.
Per maggiori dettagli sulla validazione di dominio, si rimanda alla sezione Validazione di dominio.