【问题标题】:Imported Patch colors not working correctly in NetLogo导入的补丁颜色在 NetLogo 中无法正常工作
【发布时间】:2019-11-07 00:38:57
【问题描述】:

我一直在尝试使用 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

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    Diesel,你有一个很好的开始!我在下面放了一些代码来回答你的问题。

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

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

    另外,我注意到当您的分子撞击界面时,您正在向 ycor 添加 100。这可能会将分子完全移出视线,这可能会令人困惑,因为默认视图只有 32 个单位高。我将 100 更改为 5 以保持分子可见。

    我清理了一些东西并确认模型运行成功。没有解决正确反弹墙壁和关闭加热器的处理 - 那是你的工作!

    这是我在您的代码中调整的内容: ;; ;;添加了 h2o-own 部分,因此每个分子都有温度 ;;添加了一个用户选择,即是导入boilermap.png还是在此处创建一个新的 ;;如果导入,请验证颜色与有效颜色完全匹配 ;;最后添加了“make-drawing”和“verify-colors”部分 ;;将 reset-ticks 移动到设置的末尾,它的通常位置 ;;在 go 部分的末尾添加了刻度! ;;添加了 set-aircolor gray (未定义) ;;从 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
    

    【讨论】:

    • 这太棒了,非常感谢!事实证明,我几乎没有正确导入我的颜色。我想我会采用您在此处绘制形状而不是导入图像的方法。幸运的是,我的几何结构对于这个模型来说是相当基础的。
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2022-10-15
    • 2023-01-12
    相关资源
    最近更新 更多