どのように私は新しいものを作成せずにCGPathに移動することができ

StackOverflow https://stackoverflow.com/questions/2255090

  •  20-09-2019
  •  | 
  •  

質問

私はこのような私のゲーム内の領域を定義するための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を使用することができますが、私は実際に作成したいパスが実際に長方形(私は現時点ではテストしてい)ではないことを知っています。そして、と単純にタッチ領域を検出します:

if (CGPathContainsPoint(myPath, nil, location, YES))

このすべてが正常に動作し、問題は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でこの可能ですか?

ありがとうございます。

編集:私は私がUIViewに描くわけではないようGraphicsContextを持っていない言及を忘れてしまった。

役に立ちましたか?

解決

点に対してCGPathに、テストに変換を適用し、ポイントにの変換を適用することと等価である。

そのため、あなたが使用することができます。

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

しかし、あなたはまた、使用できるようにCGPathContainsPointはすでに、CGAffineTransformパラメータ(あなたがいるNULL-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を使用します。

他のヒント

KennyTMの答え@ OPの目的のために完璧に働いたが、疑問は残るます:

  

私は新しいものを作成せずにCGPathにを移動できますか?

さて、2行のコードは私のためにトリックをしました。

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top