NSPredicate для NSArray CGPoints

У меня есть NSArray CGPoints.

На самом деле я хочу получить минимальный CGRect, содержащий все CGPoints в этом массиве. Есть ли уже какая-либо функция iOS для этого?

В противном случае мне придется вручную получить minX, maxX, minY, maxY и построить CGRect следующим образом:

CGrectMake(minX, minY, maxX-minX, maxY-minY);

Для этого мне нужно отфильтровать NSArray с помощью NSPredicate.

(Я знаю, я мог бы отфильтровать массив вручную, но да ладно!...)


person Hasib. A. Samad    schedule 19.12.2012    source источник


Ответы (2)


Нет общедоступного API, который делает то, что вы просите. Вам придется написать его самостоятельно.

В любом случае, для NSPredicate это было бы неуместно. Предикат предназначен для фильтрации значений, а не для создания новых значений.

CGRect boundsOfPointArray(NSArray *array) {
    CGRect bounds = CGRectNull;
    for (NSValue *wrapper in array) {
        CGRect r = (CGRect){ wrapper.CGPointValue, CGSizeZero };
        bounds = CGRectUnion(bounds, r);
    }
}
person rob mayoff    schedule 20.12.2012
comment
Вот и все (если верно, что вы не можете использовать NSPredicate для получения максимальных и минимальных значений из NSArray CGPoints). - person Hasib. A. Samad; 20.12.2012

Этот вопрос очень неясен. Вы имеете в виду, что хотите создать минимальный CGRect, содержащий все точки, которые у вас есть в массиве? Если это так, это довольно просто, просто переберите массив точек, отслеживая minX, maxX, minY и maxY. например

CGFloat minX = CGFLOAT_MAX;
CGFloat minY = CGFLOAT_MAX;
CGFloat maxX = -CGFLOAT_MAX;
CGFloat maxY = -CGFLOAT_MAX;

for (NSValue *v in pointsArray) {
    CGPoint p = [v CGPointValue];
    minX = fminf(minX, p.x);
    minY = fminf(minY, p.y);
    maxX = fmaxf(maxX, p.x);
    maxY = fmaxf(maxY, p.y);
}

CGRect r = CGRectMake(minX, minY, maxX - minX, maxY - minY);
person Tark    schedule 19.12.2012
comment
Это именно моя цель, но мне было интересно, есть ли более элегантный подход с использованием NSPredicate. - person Hasib. A. Samad; 20.12.2012
comment
@Tark X и Y могут быть отрицательными. Вам нужно инициализировать максимумы до -CGFLOAT_MAX. - person rob mayoff; 20.12.2012
comment
@robmayoff совершенно прав, я тоже не знал о функции CGRectUnion, гораздо более аккуратном решении. - person Tark; 20.12.2012
comment
@user1423640 user1423640 как сделать использование NSPredicate более элегантным? - person Tark; 20.12.2012