导入的修补程序颜色在NetLogo中无法正常工作

导入的修补程序颜色在NetLogo中无法正常工作,netlogo,Netlogo,我一直在尝试让我的海龟们用Netlogo从墙上“反弹” 我已经导入了一个png文件,其中包含不同表面的颜色(墙壁、界面、液体、加热器,最终还会有一些)。我使用MSPaint和中的colormap创建了我的形状(一个紫色正方形,边上有棕色边框,底部有红色边框,顶部有蓝色边框) 我要做的是让海龟们从液体斑块开始,沿着直线移动,直到它们撞到一个表面(不同颜色的墙)。如果他们撞到墙上,他们应该在一个随机的方向“反弹”,如果他们击中加热器,他们的温度应该上升,他们也应该反弹离开加热器表面。如果它们撞到界面

我一直在尝试让我的海龟们用Netlogo从墙上“反弹”

我已经导入了一个png文件,其中包含不同表面的颜色(墙壁、界面、液体、加热器,最终还会有一些)。我使用MSPaint和中的colormap创建了我的形状(一个紫色正方形,边上有棕色边框,底部有红色边框,顶部有蓝色边框)

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

我遇到的问题是,海龟们四处走动,它们似乎很好地从墙上弹下来,但它们似乎对加热器和接口的颜色一无所知。我肯定我错过了一些基本的或明显的东西,但我已经为同样的怪癖挣扎了三天。任何帮助都将不胜感激

以下是我现在掌握的代码: (在此代码中,我将其设置为仅通过接口“传送”,而不管水温如何)


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

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

我怀疑您的代码忽略加热器和接口的原因是它们作为PColor导入,与您期望的颜色不匹配。我添加了一个“验证颜色”命令,用于检查导入的颜色是否正确。我还添加了一个选项,可以生成一个新的锅炉图像,以防导入仍然会导致更多问题

另外,我注意到当你的分子到达界面时,你在ycor上加了100。这可能会将分子完全向上移动到视野之外,这可能会令人困惑,因为默认视图只有32个单位高。我把100改为5以保持分子在视野中

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

以下是我在您的代码中调整的内容: ;; ;; 添加h2o,使每个分子都有一个温度 ;; 添加了一个用户选择是导入boilermap.png还是在此处创建一个新的 ;; 如果导入,请验证颜色是否与有效颜色完全匹配 ;; 在末尾添加了“绘制图纸”和“验证颜色”部分 ;; 将重置记号移到设置的末尾,即其通常位置 ;; 在围棋部分的末尾添加了记号!! ;; 添加了设置aircolor灰色(未定义) ;; 清除了“设置修补程序”部分中不需要的命令。你已经有了 已导入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

globals[液体颜色加热器颜色墙壁颜色反射颜色空气颜色接口颜色
液体加热器壁反射空气接口]
繁殖[水]
自己的[
温度
]
设置
透明海龟
清除所有情节
设置液体颜色115
设置加热器颜色19
设置墙颜色35
设置界面颜色105
设置空气颜色为灰色
如果用户选择是或否?“导入boilermap.png?”
[ 
导入pcolors“boilermap.png”
验证颜色;;检查命令部分中的PColor计数
]
[
画一幅画;;只是画一个锅炉的新形象
]
安装补丁
创造分子
重置刻度;;通常,这是设置中的最后一步
结束
设置修补程序
使用[pcolor=加热器颜色]设置加热器贴片
使用[pcolor=界面颜色]设置界面修补程序
使用[pcolor=液体颜色]设置液体贴片
使用[pcolor=墙颜色]设置墙面片
结束
制造分子
无显示
创建-h2o(总摩尔数*H20个/100)[
设置形状“圆”
将颜色设置为黑色
2号套餐
设定温度20
setxy随机xcor随机ycor
使用[pcolor=液体颜色]移动到其中一个面片
设置标签温度
]
显示
结束
外带
询问h2o[
(如果不是
pcolor=液体颜色[fd 1]
pcolor=加热器颜色[设置温度+5设置标签温度设置标题0向前1]
pcolor=接口颜色[设置ycor ycor+5向前1]
pcolor=墙壁颜色,pxcor<0[将标题135向前设置为1]
pcolor=墙颜色,pxcor>0[将标题220向前设置为1]
[bk 1
rt随机180]
)]
打上钩别忘了这个!!
结束
;; ========================== 新的效用函数===
作画
无显示
使用[pycor>1][set pcolor air color]询问补丁
使用[pycor<1][set pcolor液体颜色]询问贴片
使用[abs pycor(max pxcor-2)][设置pcolor墙颜色]询问补丁
使用[pxcor<(最小pxcor+2)][设置pcolor墙颜色]询问修补程序
使用[pycor>(max pycor-2)][set pcolor wall color]询问修补程序
使用[pycor<(最小pycor+2)][设置pcolor墙颜色]询问修补程序
显示
结束
核实颜色;;看看我们进口了什么
让好的颜色(列表)
液体颜色
暖色
墙面颜色
界面颜色
空气颜色)
使用[member?pcolor good Color]计数补丁
让坏计数补丁-好计数
输入“好的补丁程序”

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