2

重なり合う2つの円を描きました。それらを結合された新しい形状として塗りつぶし、ストロークできるようにしたいと考えています。

現時点では、パス シーケンスを 1 回作成してストロークし、そのコピーを作成して塗りつぶし、2 つの同一のパスを重ね合わせて、1 つの形状として表示します。より良いアプローチがありますか、それともこれで問題ありませんか?

更新:サンプルコードは次のとおりです。

CGMutablePathRef path = CGPathCreateMutable();

CGContextSetStrokeColorWithColor(theContext, strokeColor.CGColor);
CGContextSetLineWidth(theContext, 2);
CGContextSetFillColorWithColor(theContext, fillColor.CGColor);

CGRect rect1 = CGRectMake(0,0, mySize*0.6, mySize*0.6);
CGRect rect2 = CGRectMake(mySize*0.4,0, mySize*0.6, mySize*0.6);

CGPathAddEllipseInRect(path, NULL, rect1);
CGPathAddEllipseInRect(path, NULL, rect2);

CGContextAddPath(theContext, path);
CGContextDrawPath(theContext, kCGPathFillStroke);

CGPathRef pathFill = CGPathCreateCopy ( path );
CGContextAddPath(theContext, pathFill);
CGContextDrawPath(theContext, kCGPathFill);

CGPathRelease(path);
CGPathRelease(pathFill);

ご覧のとおり、元のパスのコピーを作成し、ストロークなしで上に描画するため、最終的に 1 つの結合された形状に見えます。重複の作成を回避する方法はありますか?

4

1 に答える 1

3

重複の作成を回避する方法はありますか?

はい: 作成しないでください。

Core Graphics のパス オブジェクトはパスであり、それ以外の何物でもありません。色、パターン、塗りつぶしまたは線のプロパティはなく、moveto、lineto、curveto、および closepath セグメントで構成されるサブパスのみです。

塗りつぶしの色、線の色、線の幅などはすべて、コンテキスト内のグラフィックス状態のプロパティです。現在のパスはコンテキストのプロパティでもあります (gstate のプロパティではありません)。

コンテキストにパスを追加するときは、パス オブジェクトからサブパスをコンテキスト内の現在のパスに追加するだけです。元のパス オブジェクトは変更されません。グラフィックス状態はなく、たとえあったとしても、「パスからコンテキストへのサブパスの追加」操作は、パス オブジェクトではなくコンテキストを変更します。

同様に、コンテキストの現在のパスを塗りつぶしたりストロークしたりしても、コンテキストの現在のパスのみがリセットされます。そのパスを構築するために使用した可能性のあるパス オブジェクトは変更されません。その場合、元のパスは既に変更されているため、パスをコピーするのは遅すぎますが、そうではないため、パスをコピーする必要はありません。

したがって、同じパス オブジェクトを現在のパスに両方とも追加するだけです。

于 2010-08-22T04:54:14.593 に答える