1

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

带有白色边界的黑色三角形

我正在我的三角形绘图应用程序中实现导出到 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 - 更智能的方法

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

4

3 回答 3

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这里,而不是它有所作为。)

于 2013-04-13T00:42:12.980 回答
0

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

于 2013-04-14T15:39:10.553 回答
0

方法 3 - 结合

我正在使用GPC – General Polygon Clipper 库,它几乎可以按要求工作。

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

下面是 GPC 的输出。看不到白边。

使用 GPC 时的输出。


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

下面是 Clipper 的输出,它显示了白色边缘。 使用 Clipper 时的输出,有白边

于 2013-05-11T20:01:54.243 回答