2013-08-04 2 views
0

Как я могу получить случайный CGPoint, который находится за пределами границ экрана (рамки)?Случайные CGPoint (ы)

Также, учитывая эту точку, как мне найти симметричную точку к ней до середины экрана - например, скажем, у меня есть точка (ширина + 1, высота + 1). Теперь симметричная точка (-1, -1). Скажем, что у меня (-1, высота +1) - симметричная (ширина + 1, -1).

Надеюсь, что это ясно, и спасибо!

+0

Что именно вы подразумеваете под * «вне границ экрана» *? Ваши примеры '(width, height)' и '(0, height)' не находятся за пределами, а на границе. –

+0

Мои плохие, либо края, либо снаружи. Предпочтительно снаружи. Я отредактирую –

+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. (я предположил, что inrect является «значительно больше», чем outrect, иначе много итераций цикла может быть необходимы, чтобы найти правильную точку.)

В вашем случае, вы будете использовать outrect = CGRectMake(0, 0, width, height), и inrect бы указать разрешенными домен.

И точка, симметричная (x, y) относительно середины экрана с размером (width, height) является (width - x, height - y).

UPDATE: Как я только что нашел здесь: http://openradar.appspot.com/7684419, CGRectContainsPoint возвратит ложь, если вы предоставите ему точку, которая находится на границе CGRect. Это означает, что вышеуказанный метод возвращает точку, которая находится за пределами или на границе данного прямоугольника outrect. Если это нежелательно, можно добавить дополнительные проверки. .

-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); 
} 
+0

Ваш метод возвращает случайную точку в любом из квадрантов q1, q2, q3, q4 и вполне может находиться внутри данного прямоугольника. Также ваш код игнорирует * origin * прямоугольника. –