从一个NSBezierPath中切出一个矩形

7

有没有可能从NSBezierPath中移除由路径内的NSRect区域定义的一块区域?

3个回答

11

正如评论中所指出的那样,Caswell先生的回答实际上与提问者所问相反。此代码示例展示了如何从圆形(或任何贝塞尔曲线路径)中移除矩形(或任何其他贝塞尔曲线路径)。诀窍是要“反转”您想要移除的路径,然后将其附加到原始路径中:

NSBezierPath *circlePath = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(0, 0, 100, 100)];
NSBezierPath *rectPath = [NSBezierPath bezierPathWithRect:NSMakeRect(25, 25, 50, 50)];
rectPath = [rectPath bezierPathByReversingPath];
[circlePath appendBezierPath:rectPath];

注意:如果贝塞尔曲线相交,情况会变得有点棘手。那么你必须设置正确的“绕组规则”。


5
当然可以。这就是所谓的剪辑区域: clipping regions
// Save the current clipping region
[NSGraphicsContext saveGraphicsState];
NSRect dontDrawThisRect = NSMakeRect(x, y, w, h);
// Either:
NSRectClip(dontDrawThisRect);
// Or (usually for more complex shapes):
//[[NSBezierPath bezierPathWithRect:dontDrawThisRect] addClip];
[myBezierPath fill];    // or stroke, or whatever you do
// Restore the clipping region for further drawing
[NSGraphicsContext restoreGraphicsState];

4
NSRectClip 不正确,它与当前的剪辑路径相交。因此,在应用它之后,只有在 dontDrawThisRect 区域内的内容才会被绘制,从而将该区域从剪辑区域中去除。这是与 OP 所想的完全相反的结果。 - Mike Lischke
我能用这个来移除程序中绘制的圆吗?我正在尝试在程序中实现圆形动画。圆形沿着路径移动,所以我在每次for循环迭代中创建一个新的圆形。但是如何移除旧的圆形呢?有人可以帮帮我吗? - zzzzz
这是我的问题:http://stackoverflow.com/questions/19650688/making-a-ball-circle-move-in-cocoa-using-nsbezierpathobjective-c - zzzzz

0
基于Roberto的答案,我已经将代码更新为Swift 5。这将绘制一个红色的100x100圆圈,中间切出一个60x60的矩形。
let path = NSBezierPath(ovalIn: NSRect(x: 0, y: 0, width: 100, height: 100))
let cutoutRect = NSBezierPath(rect: NSRect(x: 20, y: 20, width: 60, height: 60)).reversed
path.append(cutoutRect)
NSColor.red.setFill()
path.fill()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接