Импортированные цвета патчей не работают правильно в NetLogo - PullRequest
0 голосов
/ 04 ноября 2019

Я пытался заставить моих черепах «отскочить» от стены, используя Netlogo.

Я импортировал файл png, который имеет цвета различных поверхностей (стены, интерфейс, жидкость,обогреватель со временем будет еще несколько). Я использовал MSPaint и цветовую карту из netlogo color chart для создания своих фигур (фиолетовый квадрат, с коричневыми по боковым границам, красной рамкой внизу и синей рамкой сверху)

Я пытаюсь сделать так, чтобы черепахи начинали на жидких пятнах и двигались по прямым линиям, пока не столкнутся с поверхностью (стена разного цвета). Если они врезаются в стену, они должны «отражаться» в случайном направлении, если они попадают в нагреватель, их температура должна повышаться, и они также должны отражаться от поверхности нагревателя. Если они сталкиваются с интерфейсом и их температура превышает 100, они должны пройти через интерфейс и затем перемещаться над интерфейсом (в основном телепортироваться на несколько пикселей).

Проблема, с которой я столкнулся, заключается в том, чтоЧерепахи движутся, и они, кажется, отлично отскакивают от стен, но они, кажется, не обращают внимания на цвета обогревателя и интерфейса. Я уверен, что упускаю что-то простое или очевидное, но я три дня боролся за эту причуду. Любая помощь будет принята с благодарностью.

Вот код, который я сейчас имею: (в этом коде он настроен на «телепортацию» через интерфейс независимо от температуры воды)

 globals[ liquid-color  heater-color  wall-color  reflection-color  air-color  interface-color
          liquid        heater        wall        reflection        air        interface]

    breed [h2o water]
to setup
  clear-turtles
  reset-ticks
  clear-all-plots

  import-pcolors "boilermap.png"

  set liquid-color 115
  set heater-color 19
  set wall-color 35
  set interface-color 105

  setup-patches
  create-molecules
end


to setup-patches
  set heater patches with [pcolor = heater-color]
  set heater-color 19
  ask heater [set pcolor 19]

  set interface  patches with [pcolor = interface-color]
  set interface-color 105
  ask interface [set pcolor 105]

  set liquid patches with [pcolor = liquid-color]
  set liquid-color 115
  ask liquid [set pcolor 115]

  set wall patches with [pcolor = wall-color]
  set wall-color 35
  ask wall [set pcolor 35]

end


to create-molecules

  create-h2o (totalmoles * h20number / 100)[
    set shape "circle"
    set color black
    set size 2
    set temperature 20
    setxy random xcor random ycor
    move-to one-of patches with [pcolor = liquid-color]
  ]

to go
  ask h2o [
    (ifelse
      pcolor = liquid-color[fd 1 ];ifblock
      pcolor = heater-color [set temperature temperature + 5]
      pcolor = interface-color [set ycor ycor + 100] ;just trying to get them to jump here, regardless of their temperature
     ;elseblock 
    [ bk 1
      rt random 180]
    )]

end

1 Ответ

0 голосов
/ 05 ноября 2019

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

Кстати, заголовок вашего вопроса не совсем соответствует вашей реальной проблеме: импортированные цвета патчей не работают правильно

Я подозреваюПричина, по которой ваш код игнорирует нагреватель и интерфейс, заключается в том, что они импортированы в виде цветов, которые не соответствуют ожидаемым. Я добавил команду verify-colors, которая проверяет правильность импортированных цветов. Я также добавил опцию для создания нового образа котла, с которым вы можете работать, если импорт все еще вызывает проблемы.

Также я заметил, что вы добавляете 100 к ycor, когда ваша молекула попадает в интерфейс. Возможно, это полностью смещает молекулу из поля зрения, что может сбивать с толку, так как стандартное представление имеет высоту всего 32 единицы. Я изменил 100 на 5, чтобы держать молекулу в поле зрения.

Я очистил еще несколько вещей и подтвердил, что модель работает успешно. Обработка правильного отскока от стен и от обогревателя не рассматривалась - это ваша работа!

Вот что я настроил в вашем коде: ;;;;добавлен собственный участок воды, поэтому молекулы имеют температуру;добавлен пользовательский выбор: импортировать файл chartmap.png или создать новый здесь ;;при импорте убедитесь, что цвета точно соответствуют допустимым цветам ;;добавлены разделы "make-drawing" и "verify-colors" в конце ;;перенесена галочка сброса в конец настройки, в ее обычное местоположение ;;добавлены галочки в конец раздела go! ;;добавлен set-aircolor grey (не определено) ;;убрал ненужные команды из раздела setup-patches. У вас уже импортированы pcolors, поэтому вам не нужно устанавливать их заново.

;;добавлена ​​"установка температуры метки" в раздел создания молекул, а также в место ;;где температура в нагревателе повышается, поэтому каждая молекула показывает свою текущую температуру

Я проверил ее с переменными интерфейса h2o-number = 100 и полными молями 1 или 5 и скоростью, установленной на очень медленную. Это работает!


globals[ liquid-color  heater-color  wall-color  reflection-color  air-color  interface-color
          liquid        heater        wall        reflection        air        interface]

    breed [h2o water]

h2o-own [
  temperature 
]

to setup
  clear-turtles

  clear-all-plots

  set liquid-color 115
  set heater-color 19
  set wall-color 35
  set interface-color 105
  set air-color grey

  if-else user-yes-or-no? "import boilermap.png?"
  [ 
    import-pcolors "boilermap.png"
    verify-colors  ;;     check the command section for counts of pcolors
  ]
  [
    make-drawing  ;; just make a new image of a boiler
  ]

   setup-patches
   create-molecules
   reset-ticks  ;;  usually, do this as the last step in setup
end


to setup-patches
  set heater patches with [pcolor = heater-color]
  set interface  patches with [pcolor = interface-color]
  set liquid patches with [pcolor = liquid-color]
  set wall patches with [pcolor = wall-color]
end


to create-molecules
  no-display
  create-h2o (totalmoles * h20number / 100)[
    set shape "circle"
    set color black
    set size 2
    set temperature 20
    setxy random xcor random ycor
    move-to one-of patches with [pcolor = liquid-color]
    set label temperature
  ]
  display
end

to go 
  ask h2o [
    (ifelse
      pcolor = liquid-color[fd 1 ] 
      pcolor = heater-color [ set temperature temperature + 5  set label temperature  set heading 0 forward 1]
      pcolor = interface-color [set ycor ycor + 5  forward 1  ]  
      pcolor = wall-color and pxcor < 0 [set heading 135 forward 1]
      pcolor = wall-color and pxcor > 0 [set heading 220 forward 1]
    [ bk 1
      rt random 180]
    )]
tick   ; DONT FORGET THIS !!
end

;; ========================== new utility functions ===

to make-drawing
   no-display           
   ask patches with [ pycor > 1] [ set pcolor air-color]
   ask patches with [ pycor < 1] [set pcolor liquid-color]
   ask patches with [ abs pycor <= 1]   [ set pcolor interface-color]
   ask patches with [ pycor < (min-pycor + 4)] [ set pcolor heater-color]
   ask patches with [ pxcor > (max-pxcor - 2)] [ set pcolor wall-color]
   ask patches with [ pxcor < (min-pxcor + 2)] [ set pcolor wall-color]
   ask patches with [ pycor > (max-pycor - 2)] [ set pcolor wall-color]
   ask patches with [ pycor < (min-pycor + 2)] [ set pcolor wall-color]
   display
end

to verify-colors   ;; see what we imported
  let good-colors (list 
    liquid-color  
    heater-color  
    wall-color  
    interface-color  
    air-color )
  let good-count count patches with [member? pcolor good-colors]
  let bad-count count patches - good-count
  type "good patch count " type good-count type ", bad patch count: " print bad-count
  if bad-count > 0 [ if "no" = user-yes-or-no? " bad patch colors, should I continue?" [stop] ]
end
...