在上方,您会看到我的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(虽然这可能是一个选项,看图片)
答案 0 :(得分:3)
在min
和max
之间获取随机数的通用公式为:
let rand = arc4random_uniform(max - min) + min
但在您的情况下,如果您对x
和y
值执行此操作,则不会获得绿色和红色圆圈之间的值。您将在包含圆圈的框中获取值。
要获得两个圆圈之间的随机点,您需要这些内容:
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中心的x
和y
。将这些添加到您的实际中心点以获取最终值。
答案 1 :(得分:2)
为了在环空中获得均匀分布的随机点 (关于面积测量)你需要
(来自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))