gpt4 book ai didi

iphone - iOS - 使用 UIBezierPath appendPath 剪切两个路径的并集

转载 作者:可可西里 更新时间:2023-11-01 03:57:20 24 4
gpt4 key购买 nike

我正在尝试创建一个加号形状的剪切路径,这样我在同一上下文中绘制的后续路径就会删除这部分。我使用两个相互重叠的矩形路径创建剪切路径。

这就是我希望在随后绘制圆圈时最终绘图的样子:

      xXX|   |XXx
   XXXX|   |XXXX
 XXXXX|   |XXXXX
 ———      ———
 ———      ———
 XXXXX|   |XXXXX
   XXXX|   |XXXX
      xXX|   |XXx

然而,它实际上是这样的:

      xXX|   |XXx
   XXXX|   |XXXX
 XXXXX|   |XXXXX
 ——— XX———
 ——— XX———
 XXXXX|   |XXXXX
   XXXX|   |XXXX
      xXX|   |XXx

如果我没看错的话,两条矩形路径的交集不会构成剪贴蒙版的一部分。

在这种情况下,appendPath 似乎(不足为奇)不会从我的两个矩形路径创建单一的统一路径 - 我假设对此我无能为力。此外,Core Graphics 似乎没有任何与路径联合等相关的功能。

有人知道我能做什么吗?我包含了相关的代码片段。

使用一条路径绘制加号不是解决方案,因为我想将其他重叠路径添加到我的剪贴蒙版。

        CGContextSaveGState(context);

// create clipping path
UIBezierPath *clippingPath = [UIBezierPath bezierPath];
clippingPath = [UIBezierPath bezierPathWithRect:CGRectMake(centrePoint.x - 2.0f, 0.0f, 4.0f, self.sizeY)];
[clippingPath appendPath:[UIBezierPath bezierPathWithRect:CGRectMake(0.0f, centrePoint.y - 2.0f, self.sizeX, 4.0f)]];

// use the clipping path to create a hole in the context
CGContextAddPath(context, clippingPath.CGPath);
CGRect boundingRect = CGContextGetClipBoundingBox(context);
CGContextAddRect(context, boundingRect);
CGContextEOClip(context);

// draw the icon shape (clipped portion is removed)
iconBezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.sizeX / 3.0f, self.sizeY / 2.25f, self.sizeX / 3.0f, self.sizeX / 3.0f)];

[highlightColor setFill];
[iconBezierPath fill];
CGContextRestoreGState(context);

最佳答案

您可以使用CGRectIntersection

添加回被交集淘汰的部分
    CGContextSaveGState(context);

CGRect rect1 = CGRectMake(centrePoint.x - 2.0f, 0.0f, 4.0f, self.sizeY);
CGRect rect2 = CGRectMake(0.0f, centrePoint.y - 2.0f, self.sizeX, 4.0f);
CGRect rect3 = CGRectIntersection(rect1, rect2);

CGContextAddRect(context, rect1);
CGContextAddRect(context, rect2);
CGContextAddRect(context, rect3);

CGRect boundingRect = CGContextGetClipBoundingBox(context);
CGContextAddRect(context, boundingRect);
CGContextEOClip(context);

// draw the icon shape (clipped portion is removed)
iconBezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.sizeX / 3.0f, self.sizeY / 2.25f, self.sizeX / 3.0f, self.sizeX / 3.0f)];

[highlightColor setFill];
[iconBezierPath fill];

CGContextRestoreGState(context);

这满足了你的问题的要求,但是否完全满足你的需求取决于“其他重叠路径”的性质。

enter image description here

关于iphone - iOS - 使用 UIBezierPath appendPath 剪切两个路径的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com