随机CGPoint(s)

时间:2013-08-04 10:47:09

标签: math core-graphics

如何获得屏幕边界(框架)之外的随机CGPoint?

另外,考虑到这一点,我怎样才能找到到屏幕中间的对称点 - 例如说我有点(宽度+ 1,高度+ 1)。现在对称点是(-1,-1)。假设我有(-1,高度+1) - 对称的是(宽度+ 1,-1)。

希望这很清楚,谢谢!

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可以使用以下方法:

- (CGPoint) randomPointIn:(CGRect)inrect outsideOf:(CGRect)outrect
{
    CGPoint p;
    do {
        p.x = inrect.origin.x + inrect.size.width * (float)arc4random()/(float)UINT32_MAX;
        p.y = inrect.origin.y + inrect.size.height * (float)arc4random()/(float)UINT32_MAX;
    } while (CGRectContainsPoint(outrect, p));
    return p;
}

它返回inrect内的随机点,但在outrect之外。 (我假设inrectoutrect“大得多”, 否则可能需要很多循环迭代才能找到有效点。)

在您的情况下,您将使用outrect = CGRectMake(0, 0, width, height), 并且inrect将指定允许的域。

(x, y)相对于屏幕中间对称的点 尺寸为(width, height)的{​​{1}}。

更新:正如我刚才所见:http://openradar.appspot.com/7684419, 如果您在(width - x, height - y)的边界上提供一个点,CGRectContainsPoint将返回false。这意味着上面的方法返回一个在...之外的点 或在给定矩形CGRect的边界上。如果不需要, 可以添加额外的支票。

答案 1 :(得分:-1)

我相信这应该有用。

//To get a random point
- (CGPoint)randomPointOutside:(CGRect)rect
{
    // arc4random()%(int)rect.size.width
    // This gets a random number within the width of the rectangle
    //
    // (arc4random()%2) ? rect.size.width : 0)
    // This has a 50:50 to put the point in the q1 quadrant relative to the top right point of the rect
    //
    //    q4       q1
    //   _____ +  
    //  |     |
    //  | q3  |    q2
    //  |_____|
    //
    float x = arc4random()%(int)rect.size.width + ((arc4random()%2) ? rect.size.width : 0);
    float y = arc4random()%(int)rect.size.height + ((arc4random()%2) ? rect.size.height : 0);
    return CGPointMake(x, y);
}

//To get the symmetrical point
- (CGPoint)symmetricalPoint:(CGPoint)p around:(CGRect)rect
{
    return CGPointMake((p.x-rect.size.width) * -1, (p.y-rect.size.height) * -1);
}