从整个空间中按照精确的百分比在世界中间制作盒子

时间:2014-05-24 12:34:41

标签: netlogo

我想在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%,但是在世界的中间我试图在半径范围内使用,但它没有给我一个正确的区域。

提前致谢

1 个答案:

答案 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