NetLogo中如何创建Patch轮廓?解决海龟行走位置异常问题
在NetLogo中创建Patch轮廓网格并让海龟在方块内移动
要实现白色背景、黑色线条的简洁Patch轮廓网格,同时确保海龟在方块内部移动,可通过以下步骤解决:
一、绘制Patch轮廓网格
核心思路是将所有Patch设为白色背景,仅绘制每个Patch的边界线条(避免重复绘制相邻Patch的共享边)。在setup过程中执行以下代码:
to setup clear-all ; 设置所有Patch为白色背景 ask patches [ set pcolor white ] ; 绘制每个Patch的右边界和下边界(避免重复绘制共享边) ask patches [ ; 右边界:从Patch右上角到右下角 draw-line (pxcor + 0.5) (pycor + 0.5) (pxcor + 0.5) (pycor - 0.5) black ; 下边界:从Patch左下角到右下角 draw-line (pxcor - 0.5) (pycor - 0.5) (pxcor + 0.5) (pycor - 0.5) black ] ; 补全画布最左侧的左边界和最上方的上边界 ask patches with [pxcor = min-pxcor] [ draw-line (pxcor - 0.5) (pycor + 0.5) (pxcor - 0.5) (pycor - 0.5) black ] ask patches with [pycor = max-pycor] [ draw-line (pxcor - 0.5) (pycor + 0.5) (pxcor + 0.5) (pycor + 0.5) black ] ; 创建初始海龟,定位在Patch中心(确保在方块内部) create-turtles 1 [ setxy random-xcor random-ycor set shape "circle" set color red ] reset-ticks end
二、确保海龟在方块内部移动
海龟走在线条上的本质是其坐标落在Patch的边界(pxcor±0.5或pycor±0.5位置),可通过两种方式避免:
方式1:让海龟移动到相邻Patch的中心
直接让海龟跳转到相邻Patch的中心坐标,完全避开边界:
to go ask turtles [ ; 随机选择相邻方向(含原地) let dx one-of [-1 0 1] let dy one-of [-1 0 1] ; 仅当方向非原地时移动 if dx != 0 or dy != 0 [ setxy (pxcor + dx) (pycor + dy) ] ] tick end
方式2:限制海龟在当前Patch内部自由移动
如果需要海龟自由滑动而非跳转到Patch中心,可通过clamp函数限制坐标范围,预留微小余量避免触碰边界:
to go ask turtles [ ; 自由移动示例:随机转向并前进 rt random 360 fd 0.3 ; 限制坐标在当前Patch内部(留0.01余量避免碰到边界线条) set xcor clamp (pxcor - 0.49) (pxcor + 0.49) xcor set ycor clamp (pycor - 0.49) (pycor + 0.49) ycor ] tick end
内容的提问来源于stack exchange,提问作者Noga
相关产品推荐
相关产品推荐

