Если я правильно понимаю ваш вопрос, вы можете использовать следующий метод:
- (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
. Если это нежелательно, можно добавить дополнительные проверки. .
Что именно вы подразумеваете под * «вне границ экрана» *? Ваши примеры '(width, height)' и '(0, height)' не находятся за пределами, а на границе. –
Мои плохие, либо края, либо снаружи. Предпочтительно снаружи. Я отредактирую –
Хорошо, но какой должен быть возможный диапазон случайных точек? –