我想在Netlogo世界中间制作盒子
我设法制作了一个盒子,但是在我的空间的角落里,原点的位置是角落,最大pxcor = 9,maxpycor = 9
25%的代码
to setup-area-25%
ask patches with [pxcor >= 5 and pycor >= 5] [ set pcolor blue ]
end
和50%的其他代码
to setup-area-50%
ask patches with [pxcor >= -5 and pycor >= 5] [ set pcolor blue ]
end
我想让蓝色区域代表世界的25%和50%,但是在世界的中间我试图在半径范围内使用,但它没有给我一个正确的区域。
提前致谢
答案 0 :(得分:2)
这是一种快速而肮脏的方式,它不一定会为您提供您想要的精确百分比,但可能足够好,具体取决于您尝试做的事情:< / p>
to make-box [ pct box-color ]
let side round sqrt (count patches * (pct / 100))
let x min-pxcor + ceiling ((world-width - side) / 2)
let y min-pycor + ceiling ((world-height - side) / 2)
ask patches with [
pxcor >= x and pxcor < x + side and
pycor >= y and pycor < y + side
] [
set pcolor box-color
]
end
调用make-box 25 red
会给你一个大约占整个区域25%的红色方块,调用make-box 50 blue
应该给出一个大约50%的蓝色方块等。
代码使用所需框区域的平方根作为要绘制的框的一侧。然而,并非所有数字都是完美的正方形,这就是为什么你不能总是得到你想要的确切百分比。您可以尝试寻找最接近的因子对,但在某些情况下,它们不是非常方形。例如,默认NetLogo世界大小的50%是544.5补丁。如果我们围绕这个,我们得到545个补丁:不是一个完美的正方形。最准确地给出545的最接近的因子对是109 * 5,这可能不是你想要的。
修改强>
这是一个使用最接近因子对的版本,因此总是给出一个等于所需世界百分比的面积(四舍五入到整数个补丁,但不能避免)。请注意,盒子最终可能比正方形更加矩形;非常好,它可以环绕世界。如果您想避免这种情况,您必须改变世界规模或要求的百分比。
to make-box [ pct box-color ]
let n round (count patches * (pct / 100))
let h height (floor sqrt n) n
let w (n / h)
let x min-pxcor + ceiling ((world-width - w) / 2)
let y min-pycor + ceiling ((world-height - h) / 2)
ask patches with [
pxcor >= x and pxcor < x + w and
pycor >= y and pycor < y + h
] [
set pcolor box-color
]
end
to-report height [ h n ]
report ifelse-value (n mod h = 0) [ h ] [ height (h - 1) n ]
end
找到最接近的因子对的算法松散地跟随this answer。