我想在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
子类,包含三个点和一个颜色。
问题在于,即使他们共享两个点,当我用这个代码填充它们时,它们之间也有一个“空格”,如图所示:
问题:任何人都知道如何摆脱空间,以便从一个三角形到另一个三角形无缝过渡,没有任何线条或它们之间的任何东西?我想继续使用Quartz2D,但我很高兴能提供任何帮助。谢谢!
编辑:有答案显示问题是由子像素消除锯齿引起的,并添加了行
CGContextSetAllowsAntialiasing(ctx, NO);
到fillTriangle
方法解决了这个问题。但这不是我想看到的结果 - 我不喜欢它有别名,如第二张图所示。
问题已更新:您知道吗,如何解决这两个问题,即保持图像干净,没有丑陋的锯齿,但三角形之间没有空格?
EDIT2:因此,正如答案所指出的,我可以添加行笔划代码,删除抗锯齿标记,笔划将填充空格。这是显示发生的事情的最后一张图片:
注意在框外重叠的线条。我想知道原因可能是什么,并且当我将宽度设置为0.5f 时它消失了(因为视网膜,转换为1px,这可能是响应者的想法),这真的解决了整件事情。感谢大家的帮助!
答案 0 :(得分:1)
CGContextSetShouldAntialias(context, NO);
一切都应该没问题。
编辑: 如果需要抗锯齿(您更新的多色示例),您可以尝试不仅填充三角形,还可以使用相同的颜色描绘其边框,线宽为1px:
CGContextSetLineWidth(ctx, 0.5f);
CGContextDrawPath(ctx, kCGPathFillStroke);
当然,在这种情况下你应该删除CGContextSetShouldAntialias
行。这是一个简单的解决方案,但可能不是最好的性能,因为路径必须被抚摸和填充。
答案 1 :(得分:1)
您可能会获得子像素渲染的抗锯齿效果。当事情不是积分点时会发生这种情况。
但更重要的是,如果这些需要共享边缘并且颜色相同,则只需绘制四边形。