导入的修补程序颜色在NetLogo中无法正常工作
我一直在尝试让我的海龟们用Netlogo从墙上“反弹” 我已经导入了一个png文件,其中包含不同表面的颜色(墙壁、界面、液体、加热器,最终还会有一些)。我使用MSPaint和中的colormap创建了我的形状(一个紫色正方形,边上有棕色边框,底部有红色边框,顶部有蓝色边框) 我要做的是让海龟们从液体斑块开始,沿着直线移动,直到它们撞到一个表面(不同颜色的墙)。如果他们撞到墙上,他们应该在一个随机的方向“反弹”,如果他们击中加热器,他们的温度应该上升,他们也应该反弹离开加热器表面。如果它们撞到界面上并且温度高于100,它们应该穿过界面,然后在界面上方移动(基本上传送几个像素) 我遇到的问题是,海龟们四处走动,它们似乎很好地从墙上弹下来,但它们似乎对加热器和接口的颜色一无所知。我肯定我错过了一些基本的或明显的东西,但我已经为同样的怪癖挣扎了三天。任何帮助都将不胜感激 以下是我现在掌握的代码: (在此代码中,我将其设置为仅通过接口“传送”,而不管水温如何)导入的修补程序颜色在NetLogo中无法正常工作,netlogo,Netlogo,我一直在尝试让我的海龟们用Netlogo从墙上“反弹” 我已经导入了一个png文件,其中包含不同表面的颜色(墙壁、界面、液体、加热器,最终还会有一些)。我使用MSPaint和中的colormap创建了我的形状(一个紫色正方形,边上有棕色边框,底部有红色边框,顶部有蓝色边框) 我要做的是让海龟们从液体斑块开始,沿着直线移动,直到它们撞到一个表面(不同颜色的墙)。如果他们撞到墙上,他们应该在一个随机的方向“反弹”,如果他们击中加热器,他们的温度应该上升,他们也应该反弹离开加热器表面。如果它们撞到界面
迪塞尔,你有一个很好的开始!我在下面放了一些代码来回答您的问题 顺便说一句,你问题的标题与你的实际问题并不相符:导入的补丁颜色无法正常工作 我怀疑您的代码忽略加热器和接口的原因是它们作为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