导入的补丁颜色在 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
我一直在尝试使用 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