三角形与石英2D绘图完美对齐

时间:2014-06-24 15:54:08

标签: ios drawing quartz-2d

我想在2D空间中绘制两个一般三角形,使得它们使用Quartz2D共享一条边。我正在使用此代码进行绘图:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    Triangle *t1 = [triangles objectAtIndex:0];
    Triangle *t2 = [triangles objectAtIndex:1];

    [self fillTriangle:t1 inContext:context];
    [self fillTriangle:t2 inContext:context];
}

- (void) fillTriangle:(Triangle *)t inContext:(CGContextRef)ctx
{
    CGContextMoveToPoint(ctx, t.p1.p.x, t.p1.p.y);
    CGContextAddLineToPoint(ctx, t.p2.p.x, t.p2.p.y);
    CGContextAddLineToPoint(ctx, t.p3.p.x, t.p3.p.y);
    CGContextAddLineToPoint(ctx, t.p1.p.x, t.p1.p.y);

    CGContextSetFillColorWithColor(ctx, t.color.CGColor);
    CGContextFillPath(ctx);
}

其中Triangle是一个NSObject子类,包含三个点和一个颜色。

问题在于,即使他们共享两个点,当我用这个代码填充它们时,它们之间也有一个“空格”,如图所示:

Two triangles sharing one edge

问题:任何人都知道如何摆脱空间,以便从一个三角形到另一个三角形无缝过渡,没有任何线条或它们之间的任何东西?我想继续使用Quartz2D,但我很高兴能提供任何帮助。谢谢!

编辑:有答案显示问题是由子像素消除锯齿引起的,并添加了行

CGContextSetAllowsAntialiasing(ctx, NO);

fillTriangle方法解决了这个问题。但这不是我想看到的结果 - 我不喜欢它有别名,如第二张图所示。

Two triangles aliased

问题已更新:您知道吗,如何解决这两个问题,即保持图像干净,没有丑陋的锯齿,但三角形之间没有空格?

EDIT2:因此,正如答案所指出的,我可以添加行笔划代码,删除抗锯齿标记,笔划将填充空格。这是显示发生的事情的最后一张图片:

enter image description here

注意在框外重叠的线条。我想知道原因可能是什么,并且当我将宽度设置为0.5f 时它消失了(因为视网膜,转换为1px,这可能是响应者的想法),这真的解决了整件事情。感谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

问题是您正在使用抗锯齿进行绘制。通过

为您的上下文禁用它
    CGContextSetShouldAntialias(context, NO);

一切都应该没问题。

编辑: 如果需要抗锯齿(您更新的多色示例),您可以尝试不仅填充三角形,还可以使用相同的颜色描绘其边框,线宽为1px:

    CGContextSetLineWidth(ctx, 0.5f);
    CGContextDrawPath(ctx, kCGPathFillStroke); 

当然,在这种情况下你应该删除CGContextSetShouldAntialias行。这是一个简单的解决方案,但可能不是最好的性能,因为路径必须被抚摸和填充。

答案 1 :(得分:1)

您可能会获得子像素渲染的抗锯齿效果。当事情不是积分点时会发生这种情况。

但更重要的是,如果这些需要共享边缘并且颜色相同,则只需绘制四边形。