一组边界外的随机点?

时间:2015-08-05 20:46:04

标签: actionscript-3 random

我想生成一个在我的屏幕之外的点(x,y)。这样做的原因是我想要将一个对象补间到屏幕外部,而补间的原因而不仅仅是给它一个随机的X和Y速度是因为对于这个实例,使用greensock补间比创建一个更新循环更简单。

那么,生成这个数字的优雅方法是什么?我目前的解决方案是粗糙的,并且不允许在角落之间进行补间。

var quad:int = irand(1, 4); //generates a random integer between and including the min and max
var maxX:Number = frame.width;
var minX:Number = -frame.width;
var maxY:Number = frame.height;
var minY:Number = -frame.height;

if (quad == 1) //top
{
    maxY = -frame.height;
    minY = -frame.height - 50;
}
else if (quad == 2) //left
{
    maxX = -frame.width;
    minX = -frame.width - 50;
}
else if (quad == 3) //bottom
{
    maxY = frame.height + 50;
    minY = frame.height;
}
else if (quad == 4) //right
{
    maxX =frame.width + 50;
    minX = frame.width;
}

//first param is duration in seconds
//rand generates a number between the given values      
objectToTween.tweenTo(rand(1,2), { 
                        x: rand(minX, maxX),
                        y: rand(minY, maxY),
                        repeat: -1,
                        yoyo: false,
                        scaleX: 1,
                        scaleY: 1,
                        delay: rand(0,1),
                        ease: Quad.easeIn});

所以希望很清楚,这个解决方案会选择一个随机方向并将对象转向该方向。我想知道是否有办法在两个给定范围之间生成一个随机数。 (例如,介于-100和100之间,但不包括-50到50)然后将其应用于2维

1 个答案:

答案 0 :(得分:0)

你想要什么

所以你有一个矩形框f:

┌───┐
│   │
│ f │
│   │
└───┘

和一个对象o的矩形边界框将被补间到f:

的外部
┌─────┐
│  o  │
└─────┘

f 的外部是o的位置,其中f和o彼此接触但不重叠。

o的某些有效目标位置如下所示:

      ┌───┐
      │   │
      │ f ├─────┐  1
      │   │  o  │
      └───┴─────┘

      ┌───┐
      │   │
      │ f │
      │   │        2
  ┌───┴─┬─┘
  │  o  │
  └─────┘

┌─────┐
│  o  ├───┐
└─────┤   │        3
      │ f │
      │   │
      └───┘

     ┌─────┐
     │  o  │
     └┬───┬┘
      │   │        4
      │ f │
      │   │
      └───┘

由于o和f的接触,o的一侧总是与f共享。对于上述情况,即

  1. f右边是左边的
  2. f的底部是o的顶部
  3. f左边是正确的
  4. f的顶部是o的底部
  5. 在边缘情况下(双关语),共享两条边,即共享一个角点(从示例3开始,向上移动一点):

    ┌─────┐
    │  o  │
    └─────┼───┐ 
          │   │
          │ f │
          │   │
          └───┘
    

    o不能向上或向左走。请记住我在上面说过的 f 之外的定义,它完全足够,比“除了矩形f的空间的无穷大”简单得多。

    如果你向右移动o,你会获得x位置的最大值(最右边的位置):

              ┌─────┐
              │  o  │
          ┌───┼─────┘
          │   │
          │ f │
          │   │
          └───┘
    

    我希望这说明至少有一个维度总是由哪些方面相互接触而预先确定,另一个方面是从限制范围内随机选择的。在这些限制(最小和最大)时,两个框架只会在角落处相互接触。

    有你的问题:

    x: rand(minX, maxX),
    y: rand(minY, maxY),
    

    相反,首先将o的1维随机地设置为上述4个示例中表示的一个案例。任

    • x由f左边或者f确定 正确(也取决于o的宽度和注册点),或
    • y由f的顶部或底部决定(也取决于o的heihgt和注册点)

    限制中随机选择另一个。

    你需要什么

    随之而来的是随机性很大,将这么多努力用于确定目标位置是不合理的。

    考虑另一种方法。确定f周围的圆,这将保证在f之外。然后根据该角度随机确定角度(方向)和补间。这将使补间看起来略有不同,因为它们可见的持续时间取决于方向(角度),但这种差异几乎不会引人注意。