我正在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像素厚的笔画。
将所有三角形挤出2个像素,使三角形重叠。
将触摸三角形组合成一个多边形。
也许PDF有消除边界的设置。说不上。
创建一个过滤器,用于检测边界像素并消除它们。这对我不起作用,需要保存为PDF。 iOS,AFAIK上的PDF不支持着色器代码。
有没有更好的方法将三角形拼接在一起?
答案 0 :(得分:2)
您的坐标(x0
,y0
,x1
,y1
等)是否为整数点值?人们常常犯这个错误,因为他们习惯于将视图框架设置为整个点边界。 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)
我正在使用GPC – General Polygon Clipper library,它几乎可以正常工作。
我一次运行一个三角形的UNION操作。直到所有三角形都被UNION加入到结果中。
以下是GPC的输出。没有白色边缘。
我也尝试使用Angus Johnson's Clipper library,但无法通过UNIONing一次构建一个三角形来构建多边形。它只删除了三角形之间的一些白边。尽管Clipper似乎比GPC更强大。
下面是Clipper的输出,它显示白色边缘。