导入的补丁颜色在 NetLogo 中无法正常工作

Imported Patch colors not working correctly in NetLogo

我一直在尝试使用 Netlogo 让我的乌龟 'bounce' 离开墙壁。

我导入了一个 png 文件,其中包含不同表面的颜色(墙壁、界面、液体、加热器最终会有更多)。我使用 MSPaint 和来自 netlogo color chart 的颜色图来创建我的形状(一个紫色正方形,侧边框为棕色,底部为红色边框,顶部为蓝色边框)

我想要做的是让海龟从液体块开始并沿直线移动,直到它们撞到一个表面(不同颜色的墙)。如果它们撞到墙上,它们应该 'bounce' 朝随机方向离开,如果它们撞到加热器,它们的温度应该升高,它们也应该从加热器表面反弹。如果他们撞到界面并且温度在100以上,他们应该穿过界面然后在界面上方移动(基本上传送几个像素)。

我遇到的问题是海龟会四处走动,它们似乎在墙壁上弹跳得很好,但它们似乎没有注意到加热器和界面的颜色。我确定我遗漏了一些基本的或明显的东西,但我已经为同样的怪癖苦苦挣扎了三天。任何帮助将不胜感激。

这是我现在的代码: (在此代码中,无论水温如何,我都通过界面将其设置为 'teleport')

 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

Diesel,你的开端很棒!我在下面放了一些代码来回答你的问题。

顺便说一句,您问题的标题与您的实际问题不符:导入的补丁颜色无法正常工作

我怀疑您的代码忽略加热器和接口的原因是它们导入的颜色与您预期的不匹配。我添加了一个 verify-colors 命令来检查导入的颜色是否正确。我还添加了一个选项来生成您可以使用的新锅炉图像,以防导入仍然导致更多问题。

此外,我注意到当您的分子撞击界面时,您将 100 添加到 ycor。这可能会将分子完全移出视图,这可能会造成混淆,因为默认视图只有 32 个单位高。我将 100 更改为 5 以保持分子可见。

我又清理了一些东西并成功确认了模型运行。没有解决从墙壁和加热器上正确弹起的问题——那是你的工作!

这是我在您的代码中调整的内容: ;; ;;添加了 h2o-own 部分,因此每个分子都有温度 ;;在此处添加了 user-choice 是导入 boilermap.png 还是创建新的 ;;如果导入,请验证颜色是否与有效颜色完全匹配 ;;在末尾添加了 "make-drawing" 和 "verify-colors" 部分 ;;将 reset-ticks 移动到设置的末尾,它通常的位置 ;;在 go 部分的末尾添加了刻度! ;;添加 set-aircolor 灰色(未定义) ;;从 setup-patches 部分清除不需要的命令。你已经拥有 pcolors 已导入,因此您无需再次设置它们。

;;将 "set label temperature" 添加到 create-molecules 部分以及该位置 ;;加热器的温度升高,因此每个分子显示其当前温度

我用接口变量 h2o-number =100 和 total-moles 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