适合多边形

时间:2013-04-12 23:40:57

标签: ios pdf core-graphics cgpdfcontext

如何消除三角形之间的边界?

black triangles with white boundaries

我正在triangle drawing app中实施export-to-pdf。上图显示了pdf输出的样子。到处都有白色边界,宽度不到1像素。

三角形可以有任何颜色。


我绘制每个三角形,如下所示:

CGContextBeginPath(context);
CGContextMoveToPoint(context, x0, y0);
CGContextAddLineToPoint(context, x1, y1);
CGContextAddLineToPoint(context, x2, y2);
CGContextClosePath(context);
CGContextFillPath(context);

重要的是黑色和白色三角形具有相同的尺寸。


途径

方法1 - 描边

在所有三角形周围画一个1像素厚的笔画。

方法2 - 挤压

将所有三角形挤出2个像素,使三角形重叠。

方法3 - 合并

将触摸三角形组合成一个多边形。

方法4 - PDF重叠设置

也许PDF有消除边界的设置。说不上。

方法5 - 后处理

创建一个过滤器,用于检测边界像素并消除它们。这对我不起作用,需要保存为PDF。 iOS,AFAIK上的PDF不支持着色器代码。

方法X - 更聪明的方式

有没有更好的方法将三角形拼接在一起?

3 个答案:

答案 0 :(得分:2)

您的坐标(x0y0x1y1等)是否为整数点值?人们常常犯这个错误,因为他们习惯于将视图框架设置为整个点边界。 CoreGraphics使用您提供的坐标上的一个点线居中绘制。我怀疑你可以通过在所有情况下将坐标调整0.5点来消除你的文物:

CGContextBeginPath(context);
CGContextMoveToPoint(context, x0 + 0.5, y0 + 0.5);
CGContextAddLineToPoint(context, x1 + 0.5, y1 + 0.5);
CGContextAddLineToPoint(context, x2 + 0.5, y2 + 0.5);
CGContextClosePath(context);
CGContextFillPath(context);

编辑:其实我认为这不会起作用。这是另一个建议:

我要离开之前的评论,因为我认为我对CoreGraphics坐标的说法是正确的,但是我尝试了一些你所描述的设置的实验,并且将所有内容都移除并没有消除那些边框瑕疵。但是添加这一行确实:

CGContextSetAllowsAntialiasing(context, false);

(我不知道为什么CGContextSetAllowsAntialiasing被宣布为stdbool样式bool,但是,这就是为什么我在这里使用false代替NO,而不是差异。)

答案 1 :(得分:0)

便宜/简单的解决方案是绘制每个三角形两次。这将减少抗锯齿,但会增加边缘的覆盖范围。如果颜色全部相同,则渲染为单个路径也应该有效。

答案 2 :(得分:0)

方法3 - 合并

我正在使用GPC – General Polygon Clipper library,它几​​乎可以正常工作。

我一次运行一个三角形的UNION操作。直到所有三角形都被UNION加入到结果中。

以下是GPC的输出。没有白色边缘。

Output when using GPC.


我也尝试使用Angus Johnson's Clipper library,但无法通过UNIONing一次构建一个三角形来构建多边形。它只删除了三角形之间的一些白边。尽管Clipper似乎比GPC更强大。

下面是Clipper的输出,它显示白色边缘。 Output when using Clipper, has white edges