根据具有最小和最大偏移的中心点计算随机X和Y.

时间:2018-04-05 20:09:41

标签: swift

enter image description here

在上方,您会看到我的UIView,这是一个黑色边框的矩形。中间是中心(红点),还有2个圆圈。

我的目标是生成一个随机的X和Y点,其最小和最大偏移量基于UIView的中心。绿色圆圈表示最小的X和Y位置,而红色外圆圈表示最大的X和Y位置。我的目标是在这两个圆圈之间生成一个X和Y值。

假设我有UIView,其大小为100,100,我希望获得一个随机的X和Y值,其最小偏移量为视图的80%(绿色圆圈),最大偏移量为120% (红圈)。

我尝试生成随机X值:

var finalX = CGFloat.random(lower: heightUIView *  0.8, heightUIView * 1.2)

let toDown = Int.random(lower: 0, 1) == 0 ? true : false
if !toDown {
    finalX = -finalX
}

这永远不会产生一个好的X值,因为这些值不能为0(虽然这可能是一个选项,看图片)

2 个答案:

答案 0 :(得分:3)

minmax之间获取随机数的通用公式为:

let rand = arc4random_uniform(max - min) + min

但在您的情况下,如果您对xy值执行此操作,则不会获得绿色和红色圆圈之间的值。您将在包含圆圈的框中获取值。

要获得两个圆圈之间的随机点,您需要这些内容:

let greenRadius = 4 // whatever the radius of the green circle is
let redRadius = 10 // whatever the radius of the red circle is
let randRadius = Double(arc4random_uniform(UInt32(redRadius - greenRadius)) + UInt32(greenRadius))
let randAngle = Double(arc4random_uniform(360)) / 180 * Double.pi
let x = cos(randAngle) * randRadius
let y = sin(randAngle) * randRadius

这将为您提供围绕0,0中心的xy。将这些添加到您的实际中心点以获取最终值。

答案 1 :(得分:2)

为了在环空中获得均匀分布的随机点 (关于面积测量)你需要

  • 计算[0,2π],
  • 范围内的均匀分布角度φ
  • 计算[r 1 2 ,r 2 2 ]范围内均匀分布的半径r,
  • 计算点P =(sqrt(r)* cos(φ),sqrt(r)* sin(φ))。

(来自Wolfram的Disk Point Picking Mathworld。)

代码示例:

let r1: CGFloat = 2  // inner radius
let r2: CGFloat = 10 // outer radius

let phi = CGFloat(arc4random())/(CGFloat(UInt32.max) + 1) * 2 * .pi
let rSquared = (CGFloat(arc4random())/CGFloat(UInt32.max) * (r2 * r2 - r1 * r1) + r1 * r1)
let r = rSquared.squareRoot()

let randomPoint = CGPoint(x: r * cos(phi), y: r * sin(phi))