【问题标题】:Is there a way to set a maximum area on a random rectangle in Paper.js?有没有办法在 Paper.js 中的随机矩形上设置最大面积?
【发布时间】:2021-12-30 18:02:45
【问题描述】:

我试图在 1200x1200 画布的中心放置一个随机大小的矩形,最小尺寸为 200x200,最大尺寸为 900x900。但是,我还想在矩形上设置最大面积(900x900 最大空间的一半),以防止它成为一个巨大的正方形。基本上,我想创建大的随机矩形或类似区域的正方形,但绝不是大正方形。我有随机矩形部分工作,但不确定如何限制整个区域。

var maxSize = new Size(700, 700);              // max size of 900x900 when combined with +200 below
var randomSize = Size.random();                // random number between 0 and 1
var size = (maxSize * randomSize) + 200;       // effectively creates a 200x200 minimum size, max 900x400

var box = new Rectangle(new Point(0,0), size); // creates rectangle at 0,0 with size
box.center = (600, 600);                       // centers rectangle at 600,600
var path = new Path.Rectangle(box);            // draws rectangle on screen
    path.fillColor = '#cccccc';

【问题讨论】:

    标签: javascript canvas paperjs


    【解决方案1】:

    您有两个限制条件,您的最大尺寸和面积...
    我假设我们需要同时满足两者,我们需要在两者之间获得最小值

    长方形的面积等于长宽的乘积
    对于给定的面积,我们可以得到一个最大边作为面积的平方 = Math.sqrt(max_area)

    将其集成到您的代码中:

      const max_area = 788544
      var max_side = Math.sqrt(max_area) - 200
      var maxSize = new Size(Math.min(700, max_side), Math.min(700, max_side));
      ...
    

    【讨论】:

    • 这绝对是朝着正确方向迈出的一步,但是根据平方根预先限制边长会阻止形成任何长或高的矩形。我想知道是否有办法在原始最大值内随机化高度和宽度,然后根据 (max_area/width) 检查高度并取其最小值?
    • @MattEverson 很高兴这能让你朝着正确的方向前进,通常我们只需要这样的小推动
    【解决方案2】:

    根据上面的答案,我最终生成了随机宽度和高度,然后根据从面积和宽度推断的 max_height 检查高度。可能有一种方法可以简化它,但它似乎工作正常。谢谢!

    // Get random integer between two values, inclusive
    function getRandomLength(min, max) {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
    
    var max_area = 260000;
    var width = getRandomLength(200,900);
    var random_height = getRandomLength(200,900);
    var max_height = max_area / width;
    var height = Math.min(random_height, max_height);
    
    var size = new Size(width, height);
    
    var box = new Rectangle(new Point(0,0), size); 
    box.center = (600, 600); // centers rectangle at 600,600
    var boxPath = new Path.Rectangle(box);
    boxPath.fillColor = '#cccccc';

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多