2017-09-18 4 views
1

Je suis en train de construire un modèle pour les personnes qui marchent sur un certain chemin (plaques de route, couleur = blanc). Le mouvement des agents ne sera limité que sur la zone blanche et lorsqu'ils rencontreront une zone noire, ils tourneront de 180 degrés.Netlogo: comment arrondir en 90 180 270 360 seulement

Le problème que j'ai trouvé était lorsque j'ai essayé de définir le titre des agents. Je veux que le cap de marcher le plus proche tache rouge (destination), mais quand je l'utilise:

ensemble en direction de min-un des patchs avec [pcolor = red] [mes distances] <

les agents ne bougeront pas de leur patch. Il s'est avéré que le "titre" généré par le code ci-dessus a la valeur de -360 à 360 avec des décimales. La procédure de marche que j'ai construite ne permet que le cap avec des multiplications de 90 (-360, -180 ... 90, 180, 270, 360). Ceci est le code complet pour ma procédure de marche:

globals [ flagl flagr ] 

ask agents [ 

;reset flag 
    set flagr 0 
    set flagl 0 

; check and note if there is a path on the left or the right 
     ask patch-left-and-ahead 90 1 [if (pcolor = white) [set flagl 1]] 
     ask patch-right-and-ahead 90 1 [if (pcolor = white) [set flagr 1] 
     ] 

;in T-junction, decide to turn left or right (random) 
     if((flagl = 1) and (flagr = 1)) 
     [ 
     ifelse random 100 > 50 
     [set heading heading - 90] 
     [set heading heading + 90] 
     ] 

;if it's only applicable to turn right, then turn right 
     if((flagl = 0) and (flagr = 1)) [set heading heading + 90] 

;if it's only applicable to turn left, then turn right 
     if((flagl = 1) and (flagr = 0)) [set heading heading - 90] 

;return if there's no mor path 
     if [pcolor] of patch-at-heading-and-distance heading 1 = black [rt 180] 

;agent movement 
     **;face min-one-of patches with [pcolor = red ] [ distance myself ]** 
     fd 1 

;stopping procedure 
if [pcolor] of patch-here = red [fd 0] 
]] 

J'ai essayé de contourner le cap généré par # 1 comme ceci:

let direction heading towards min-one-of patches with [pcolor = red ] [ distance myself ] 
if direction != mod 90 
set direction 90 * round(arah/ 90) 

Cependant, il donne un avis d'erreur puisque « laissez "commande ne peut pas prendre ce genre d'entrée.

C'est la capture d'écran de la carte que j'ai construit: Map

Toute aide pour résoudre ce problème est extrêmement apprécié. Je vous remercie!

Répondre

2

Cela peut vous aider à démarrer - avec un minimum de vérification, cela semble faire l'affaire, mais vous voudrez probablement vérifier les exceptions.

Le reporter cardinal-4 prend les entrées est donné et vérifie si le modulo est égal à 0. Dans le cas contraire, il va vérifier si modulo est inférieure/égale à 45- le cas échéant, soustrait cette valeur à partir de la direction (dir) . Si modulo est supérieur à 45, soustrayez le modulo de la direction et ajoutez 90.

La procédure check imprime simplement la sortie du rapporteur pour les valeurs répertoriées.

to setup 
    ca 
    reset-ticks 
end 

to-report cardinal-4 [ heading-input ] 
    let dir heading-input 
    let remain dir mod 90 
    if remain != 0 [ 
    ifelse remain <= 45 [ 
     set dir dir - remain 
    ] 
    [ 
     set dir dir - remain + 90 
    ] 
    ] 
    report dir 
end 

Modifier: procédure améliorée check:

to check 
    let testVals [ -361 -359 -271 -269 -181 -179 -91 -89 -1 0 1 89 91 179 181 269 271 359 360 361 ] 
    print map [ i -> (word i " becomes " cardinal-4 i "\n") ] testVals 
end