2015-08-03 2 views
2

Я довольно новичок в NetLogo, и я хотел бы, чтобы создал неоднородную поверхность мира, где патчи (желтые) находятся на разных расстояниях от центрального патча (пунктирные красные круги) ,NetLogo: набор pcolor случайных патчей на определенном расстоянии от центра

Более конкретно, я хочу, чтобы выбрать 3 случайных пятна на расстоянии: 10, 20, 30 патчей от центрального патча и превратить их в желтый цвет. Я уверен, что это довольно просто сделать, но я не могу определить правильное использование дистанционной меры.

Любое предложение высоко ценится!

to setup 
    clear-all 
    setup-patches 
end 

to setup-patches 
    clear-all 
    ask patches [ set pcolor green ] 
    ask patch 0 0 
    [ 
    set pcolor yellow     
    ask patches in-radius 10 [set pcolor yellow] ; how to include distance here?? 
    ] 
    ask n-of 5 patches [ set pcolor yellow] ; or here ?? 
end 

expected result

+1

Это отличный вопрос. Наличие изображения действительно помогает понять, чего вы пытаетесь достичь. +1. –

ответ

2

Это сложнее, чем кажется! Можно подумать, что вы были бы в состоянии использовать только distance:

foreach [ 10 20 30 40 ] [ 
    ask n-of 3 patches with [ distance patch 0 0 = ? ] [ 
    set pcolor yellow 
    ] 
] 

Но вот результат, если мы отбросим n-of 3, чтобы получить все патчи на каждом расстоянии желтеть:

enter image description here

Проблема в том, что он ищет патч на точный заданное расстояние.

Возможно, вы могли бы просто дать ему немного терпимости?

foreach [ 10 20 30 40 ] [ 
    ask patches with [ 
    distance patch 0 0 > ? - 0.5 and 
    distance patch 0 0 < ? + 0.5 
    ] [ 
    set pcolor yellow 
    ] 
] 

Это лучше, но все-таки не совсем право. Некоторая часть кругов толще, чем другие:

enter image description here

Но, возможно, это достаточно хорошо для вашей цели, или вы можете настроить на толерантность немного.

Наконец, вот дурацкий способ достижения аналогичного результата:

to-report circle-at [ d ] 
    let dummies [] 
    let circle [] 
    create-turtles 2 [ 
    set dummies lput self dummies 
    ] 
    ask last dummies [ 
    setxy 0 d 
    create-link-with first dummies [ tie ] 
    ] 
    repeat 3600 [ 
    ask first dummies [ 
     right 0.1 
     ask last dummies [ 
     set circle lput patch-here circle 
     ] 
    ] 
    ] 
    ask turtle-set dummies [ die ] 
    report patch-set circle 
end 

Он использует команду tie иметь одну черепаху поворот вокруг другой и добавить патчи, которые он проходит в нашем наборе результатов. Это медленно, но это работает, и вы получите хороший гладкий круг:

enter image description here

С помощью этой процедуры, окончательный код будет:

foreach [ 10 20 30 40 ] [ 
    ask n-of 3 circle-at ? [ 
    set pcolor yellow 
    ] 
] 
+0

Ничего себе! Благодарю вас @Nicolas Payette! Я никогда не смогу понять это, это действительно сложно ... Но теперь все хорошо. – maycca

+0

Да, может быть, есть лучший, более простой способ, о котором я не думал. Но я рад, что это работает для вас! –

+0

Я добавил еще один ответ, это самая простая вещь, о которой я могу думать. Но Николас, я люблю твое безумное решение на основе галстуков. –

2

Вот еще одна альтернатива:

to setup 
    clear-all 
    ask patches [ set pcolor green ] 
    foreach [10 20 30] [ 
    repeat 3 [ 
     make-yellow-patch ? 
    ] 
    ] 
end 

to make-yellow-patch [dist] 
    create-turtles 1 [ 
    rt random-float 360 
    fd dist 
    while [pcolor = yellow] [ 
     bk dist 
     rt random-float 360 
     fd dist 
    ] 
    set pcolor yellow 
    die 
    ] 
end 

Результаты поиска:

view

observer> show sort [round distancexy 0 0] of patches with [pcolor = yellow ] 
observer: [10 10 10 19 20 20 30 30 30] 

Я не думаю, что 19 - это ошибка.Как показывает Николас, вы не хотите отдавать предпочтение какой-либо определенной части круга, так что это означает, что вам нужно разрешить некоторые изменения расстояния.

+0

Спасибо @ Сет Тису! это работает :) и мне действительно не нужно точно такое же расстояние от центрированного патча, и некоторые варианты будут полезными :) – maycca