【问题标题】:Merging paths in Core Graphics?合并核心图形中的路径?
【发布时间】:2010-08-21 00:50:16
【问题描述】:

我画了两个重叠的圆圈。我希望能够将它们填充和描边作为合并的新形状。

目前,我创建了一次路径序列,对其进行描边,然后创建一个副本,填充它并将两条相同的路径叠加在一起,使它们显示为一个形状。有没有更好的方法或者这样可以吗?

更新:这是一个示例代码:

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

如您所见,我创建了原始路径的副本并将其绘制在没有笔划的顶部,因此最终它看起来像一个统一的形状。有没有办法避免创建重复项?

【问题讨论】:

  • 那么,你想要两个圈子的联合,对吧? (请参阅imgur.com/med3v。)您希望它们都被填充和抚摸吗?请将您当前的代码编辑到您的问题中;我怀疑您所做的工作超出了您的需要,但希望确定并能够明确指出。
  • 我添加了一些代码。请参见上文。

标签: core-graphics cgpath


【解决方案1】:

有没有办法避免重复?

是的:只是不要创建它。

Core Graphics 中的路径对象是路径,仅此而已。它们没有颜色、没有图案、没有填充或描边属性,什么都没有——只有由 moveto、lineto、curveto 和 closepath 段组成的子路径。

填充颜色、描边颜色、线宽等都是上下文中图形状态的属性。当前路径也是上下文的属性(但不是 gstate)。

当您向上下文添加路径时,您所做的就是:将路径对象的子路径添加到上下文中的当前路径中。原路径对象保持不变;它没有图形状态,即使有,“从路径添加子路径到上下文”操作会更改上下文,而不是路径对象。

类似地,填充或抚摸上下文的当前路径只会重置上下文的当前路径;它不会更改您可能用于构建该路径的任何路径对象。如果是这样,那么复制路径就太晚了,因为原来的路径已经被改变了——但它没有,所以复制路径是不必要的。

所以,只需将相同的路径对象添加到当前路径两次。

【讨论】:

  • 很好的解释。我绝对没有这么想。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多