Ios 使用Quartz2D绘图完美对齐三角形

Ios 使用Quartz2D绘图完美对齐三角形,ios,drawing,quartz-2d,Ios,Drawing,Quartz 2d,我想用Quartz2D在2D空间中画两个普通三角形,它们共享一条边。我将此代码用于绘图: - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); Triangle *t1 = [triangles objectAtIndex:0]; Triangle *t2 = [triangles objectAtIndex:1]; [self fillTri

我想用Quartz2D在2D空间中画两个普通三角形,它们共享一条边。我将此代码用于绘图:

- (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
子类

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

问题:任何人都知道如何摆脱空间,从而实现从一个三角形到另一个三角形的无缝过渡,其间没有直线或任何东西?我想继续使用Quartz2D,但我很高兴能得到任何帮助。谢谢

编辑:有答案显示问题是由亚像素消除混叠和添加线条引起的

CGContextSetAllowsAntialiasing(ctx, NO);
fillTriangle
方法解决了这个问题。但这并不是我想要看到的结果——我不喜欢第二张图片中的别名

问题更新:您知道如何解决这两个问题吗,即保持图像干净,没有难看的锯齿,但三角形之间没有间距

EDIT2:因此,正如回答中所指出的,我可以添加线条笔划代码,删除抗锯齿标志,笔划将填充空间。这是最后一张显示发生了什么的图片:


请注意框外重叠的线。我想知道原因可能是什么,当我将宽度设置为0.5f时,它消失了(从视网膜开始,转换为1px,这可能是响应者的想法),这真的解决了整个问题。谢谢大家的帮助

问题在于您正在使用抗锯齿绘制。通过为您的上下文禁用它

    CGContextSetShouldAntialias(context, NO);
一切都会好起来的

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

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

当然,在这种情况下,您应该删除
CGContextSetShouldAntialias
行。这是一个简单的解决方案,但可能不是最佳性能,因为必须对路径进行笔划和填充。

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


但更重要的是,如果它们需要共享一条边并且颜色相同,只需绘制一个四边形即可

虽然我没有提到这一点(很抱歉),但颜色不必相同,所以绘制四边形不会解决问题,但你是对的,尽管我得到了亚像素渲染的抗锯齿效果!重点是:)谢谢你的回答!我想是的。请记住,Quartz基本上是一个PDF绘图模型。这意味着它会从前到后(按程序)绘制层。这就像印刷一样。(同样是PDF)这意味着你可以分层。在四边形上画一个三角形可能很方便。这样可以控制角度边的亚像素渲染。你知道什么颜色和什么颜色混在一起,这是一种把戏。类似于制作具有透明度的gif或png图像。当您使用各种合成操作模式时,效果更加明显。要解决混叠问题,您在某些方面确实受到硬件的限制。因此,在四边形顶部绘制三角形时,消除混叠处理会将右侧像素混合成颜色,以使眼睛看到更清晰的线条。但是,某些角度自然会比其他角度更加参差不齐,因此,如果可能的话,您希望像素在直角上对齐,并在颜色顶部进行抗锯齿和绘制,以混合处理角度线。与另一个答案的信息类似,但您发布了解决此问题的代码!谢谢:)编辑:事实上,它解决了三角形之间的透明线的问题,但现在不同的颜色看起来很糟糕。我将更新问题。更新了答案,并为已编辑的问题提供了可能的解决方案。非常感谢您更新了答案!我也更新了这个问题——这在某种程度上是有帮助的,但不幸的是并不完美