Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 剪裁区域之间的间隙_Objective C_Cocoa_Core Graphics - Fatal编程技术网

Objective c 剪裁区域之间的间隙

Objective c 剪裁区域之间的间隙,objective-c,cocoa,core-graphics,Objective C,Cocoa,Core Graphics,我画了很多梯形,里面填充了一个梯度。我希望他们能无缝地加入,但事实并非如此。在这种情况下,我更喜欢使用剪裁,而不是显式地用渐变填充NSBezierPath 以下是被指控的代码: -(void)drawRect:(NSRect)dirtyRect { [[NSColor blackColor]set]; NSRectFill(self.bounds); NSPoint v0 = NSMakePoint(100,100); NSPoint v1 = NSMak

我画了很多梯形,里面填充了一个梯度。我希望他们能无缝地加入,但事实并非如此。在这种情况下,我更喜欢使用剪裁,而不是显式地用渐变填充NSBezierPath

以下是被指控的代码:

-(void)drawRect:(NSRect)dirtyRect {
    [[NSColor blackColor]set];
    NSRectFill(self.bounds);

    NSPoint v0 =  NSMakePoint(100,100);
    NSPoint v1 =  NSMakePoint(200,100);
    NSPoint v2 =  NSMakePoint(100,200);
    NSPoint v3 =  NSMakePoint(200,200);
    NSPoint v4 = NSMakePoint(150, 150);

    NSBezierPath * triangle0 = [NSBezierPath bezierPath];
    [triangle0 moveToPoint:v0];
    [triangle0 lineToPoint:v1];
    [triangle0 lineToPoint:v2];
    [triangle0 closePath];

    NSBezierPath * triangle1 = [NSBezierPath bezierPath];
    [triangle1 moveToPoint:v1];
    [triangle1 lineToPoint:v2];
    [triangle1 lineToPoint:v3];
    [triangle1 closePath];

    NSGradient * gradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor whiteColor],0.0,[NSColor orangeColor],1.0,nil];

    [NSGraphicsContext saveGraphicsState];
    [triangle0 addClip];
    [gradient drawFromPoint:v0 toPoint:v4 options:NSGradientDrawsAfterEndingLocation|NSGradientDrawsBeforeStartingLocation];
     //   [gradient drawFromPoint:v0 toPoint:v4 options:0];

    [NSGraphicsContext restoreGraphicsState];

    [NSGraphicsContext saveGraphicsState];
    [triangle1 addClip];
    [gradient drawFromPoint:v3 toPoint:v4 options:NSGradientDrawsAfterEndingLocation|NSGradientDrawsBeforeStartingLocation];

    //[gradient drawFromPoint:v3 toPoint:v4 options:0];

    [NSGraphicsContext restoreGraphicsState];
我应该怎么做来避免两个三角形之间的间隙

编辑: 这里试图通过明确地填充NSBezierPath来绕过这个问题

-(void)drawRect:(NSRect)dirtyRect {
[[NSColor blackColor]set];
NSRectFill([self bounds]);

CGContextRef c = [[NSGraphicsContext currentContext] graphicsPort];
CGContextTranslateCTM(c, 0.5, 0.5);

NSPoint v0 =  NSMakePoint(100,100);
NSPoint v1 =  NSMakePoint(200,100);
NSPoint v2 =  NSMakePoint(100,200);
NSPoint v3 =  NSMakePoint(200,200);

NSBezierPath * triangle0 = [NSBezierPath bezierPath];
[triangle0 moveToPoint:v0];
[triangle0 lineToPoint:v1];
[triangle0 lineToPoint:v2];
[triangle0 closePath];

NSBezierPath * triangle1 = [NSBezierPath bezierPath];
[triangle1 moveToPoint:v1];
[triangle1 lineToPoint:v2];
[triangle1 lineToPoint:v3];
[triangle1 closePath];

[[NSColor whiteColor]set];

NSGradient * gradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor whiteColor],0.0,[NSColor orangeColor],1.0,nil];
[gradient drawInBezierPath:triangle0 angle:45];
[gradient drawInBezierPath:triangle1 angle:45+180];

NSBezierPath  * seam = [ NSBezierPath bezierPath]; [seam moveToPoint:v1]; [seam lineToPoint:v2];
[[NSColor orangeColor]set]; [seam stroke];

NSGradient * gradient2 = [[NSGradient alloc] initWithColorsAndLocations:[NSColor whiteColor],0.0,[NSColor orangeColor],0.5,[NSColor whiteColor],1.0,nil];
NSBezierPath * squarePath = [NSBezierPath bezierPath];
[squarePath moveToPoint:v0];
[squarePath lineToPoint:v1];
[squarePath lineToPoint:v3];
[squarePath lineToPoint:v2];
[squarePath closePath];
CGContextTranslateCTM(c, 200, 0);
[gradient2 drawInBezierPath:squarePath angle:45];
}

在左边,两个三角形填充了相同的渐变。 右边是一个正方形,上面有一个梯度,这是我想要达到的目标。 seam试图隐藏两个NSBezierPath之间的黑线,但实际上不起作用。在本例中,它几乎不可见,但如果我画大量这样的三角形,它将可见

编辑Rengers答案:

以下是在没有抗锯齿的情况下的外观:


从技术上讲,这是一个很好的答案,但现在的问题是,毫不奇怪,多边形的边不再是抗锯齿的。你知道如何消除剪切区域之间的间隙而不丢失边上的抗锯齿吗?

这可能是因为默认情况下启用了抗锯齿。您可以使用以下方法禁用它:

[[NSGraphicsContext currentContext] setShouldAntialias:NO];

您使用剪切而不是剪切的原因是什么:1。绘制到贝塞尔路径-或-2。用一个渐变创建一条路径?也许还有另一种方法可以更好地处理这个问题,我最初的问题是:我有一个平面二维曲面,它由两个变量函数定义:x(u,v)和y(u,v)。我想用2d渐变填充这个曲面。为此,我沿u和v细分曲面,生成二维四边形或三角形阵列。此时,我使用从原始2d渐变计算的渐变填充这些多边形,以便公共边具有相同的颜色。我在这个简单的例子(2个三角形)中尝试了这两种方法,正如您所看到的,每种方法都有自己的问题。以0.5的比例将位图上下文的内容渲染为常规上下文。您将有效地实现4x多采样。我在JavaSwing中遇到了类似的问题,最终放弃了剪裁。我为每个多边形创建了一个新的渐变填充,根本不使用剪裁。