2010-08-21 93 views
2

我畫了兩個重疊的圓圈。我希望能夠填充和撫摸它們作爲合併的新形狀。合併核心圖形中的路徑?

此刻,我創建了一次路徑序列,對它進行描邊,然後創建它的一個副本,填充它,並將兩個相同的路徑添加到彼此的頂部,以便它們顯示爲單個形狀。有更好的方法還是這樣好?

更新:這裏是一個示例代碼:

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); 

正如你所看到的,我創建原始路徑的副本,並繪製在上面沒有中風,所以最後它看起來像一個統一的形狀。有沒有辦法避免創建重複?

+0

那麼,你想要兩個圓圈的聯合,對吧? (見http://imgur.com/med3v。)你想要他們都填充和撫摸?請將您當前的代碼編輯到您的問題中;我懷疑你正在做的工作比你需要的多,但要確保並能夠明確指出。 – 2010-08-21 07:07:04

+0

我已經添加了一些代碼。請參閱上文。 – anna 2010-08-22 01:05:10

回答

3

有沒有辦法避免創建重複?

是的:只是不要創建它。

核心圖形中的路徑對象是路徑,沒有別的。它們沒有顏色,沒有圖案,沒有填充或筆畫屬性,沒有任何東西 - 只有由moveto,lineto,curveto和closepath段組成的子路徑。

填充顏色,描邊顏色,線條寬度等都是上下文中圖形狀態的所有屬性。當前路徑也是上下文的屬性(但不是gstate的屬性)。

當您向上下文添加路徑時,就是這麼做的:將路徑對象中的子路徑添加到上下文中的當前路徑中。原始路徑對象保持不變;它沒有圖形狀態,即使是這樣,「從路徑到上下文添加子路徑」操作也會更改上下文,而不是路徑對象。

類似地,填充或撫摸上下文的當前路徑僅重置上下文的當前路徑;它不會更改您可能用於構建該路徑的任何路徑對象。如果是這樣,複製路徑時會太遲,因爲原始文件已經被更改 - 但它不會,因此複製路徑是不必要的。

因此,只需將兩個路徑對象添加到當前路徑。

+0

很好的解釋。我絕對沒有想到這些條款。謝謝! – anna 2010-08-23 00:41:26