Как я могу переместить CGPath, не создавая новый - PullRequest
3 голосов
/ 13 февраля 2010

Я создаю CGPath, чтобы определить область в моей игре следующим образом:

CGPathMoveToPoint   ( myPath, NULL, center.x, center.y );
CGPathAddLineToPoint( myPath, NULL,center.x + 100, center.y);
CGPathAddLineToPoint( myPath, NULL, center.x + 100, center.y + 100);
CGPathAddLineToPoint( myPath, NULL, center.x,  center.y + 100);
CGPathCloseSubpath  ( myPath );

Я знаю, что это просто квадрат и что я мог бы просто использовать другой CGRect, но путь, который я хочу на самом деле создать, на самом деле не является прямоугольником (я сейчас только проверяю). И затем обнаружение области касания просто с помощью:

* +1007 *

Это все работает нормально, проблема в том, что CGPath может перемещаться до 40 раз в секунду. Как я могу переместить его, не создавая новый? Я знаю, что могу сделать что-то подобное, чтобы «переместить» это:

center.y += x;
CGPathRelease(myPath);
myPath = CGPathCreateMutable();
CGPathMoveToPoint   ( myPath, NULL, center.x, center.y );
CGPathAddLineToPoint( myPath, NULL,center.x + 100, center.y);
CGPathAddLineToPoint( myPath, NULL, center.x + 100, center.y + 100);
CGPathAddLineToPoint( myPath, NULL, center.x,  center.y + 100);
CGPathCloseSubpath  ( myPath );

Но я должен освободить и создать новый путь до 40 раз в секунду, что, я думаю, может привести к снижению производительности; это правда?

Я хотел бы иметь возможность перемещать его так же, как в данный момент я перемещаю некоторую CGRects, просто устанавливая начало координат на другое значение, возможно ли это с CGPath?

Спасибо.

РЕДАКТИРОВАТЬ: я забыл упомянуть, у меня нет GraphicsContext, поскольку я не рисую на UIView.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2010

Применение преобразования к CGPath и тестирование по точке эквивалентно применению обратного преобразования к точке.

Следовательно, вы можете использовать

CGPoint adjusted_point = CGPointMake(location.x - center.x, location.y - center.y);
if (CGPathContainsPoint(myPath, NULL, adjusted_point, YES)) 

Но CGPathContainsPoint уже принимает параметр CGAffineTransform (который у вас есть NULL -ed -ed), поэтому вы также можете использовать

CGAffineTransform transf = CGAffineTransformMakeTranslation(-center.x, -center.y);
if (CGPathContainsPoint(myPath, &transf, location, YES)) 

Если вы рисуете, вместо изменения пути вы можете напрямую изменить CTM в своем коде рисования.

CGContextSaveGState(c);
CGContextTranslateCTM(c, center.x, center.y);
// draw your path
CGContextRestoreGState(c);

Используйте CAShapeLayer, если вам нужна производительность.

3 голосов
/ 08 декабря 2012

@ Ответ KennyTM отлично сработал для целей ОП, но вопрос остается:

Как я могу переместить CGPath без создания нового?

* +1007 *

Ну, две строчки кода помогли мне:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];
...