【问题标题】:Fit Polygons Together将多边形组合在一起
【发布时间】:2013-04-05 15:21:05
【问题描述】:

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

我正在我的triangle drawing app 中实现导出到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 上的 PDF 不支持着色器代码,AFAIK。

方法 X - 更智能的方法

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

【问题讨论】:

    标签: ios pdf core-graphics cgpdfcontext


    【解决方案1】:

    您的坐标(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);
    

    编辑:实际上我认为这行不通。这是另一个建议:

    我要离开我以前的 cmets,因为我认为我所说的关于 CoreGraphics 坐标的内容是正确的,但我尝试了一些你描述的设置的实验,并且将所有内容转移并没有消除那些边界伪影。但是添加这一行确实:

    CGContextSetAllowsAntialiasing(context, false);
    

    (我不知道为什么 CGContextSetAllowsAntialiasing 被声明为采用 stdbool 样式的 bool,但这就是为什么我在这里使用 false 而不是 NO,并不是说它有什么不同。)

    【讨论】:

    • 根据您的建议,我重新编写了代码,以便三角形现在都在整数点处具有坐标。它使代码更加简洁。
    • 将整数点位移 0.5 没有帮助。无论是在 PDF 中还是在渲染到 UIImage 时。
    • 禁用/启用抗锯齿不会影响 PDF 生成。
    • 我会继续寻找解决方案。感谢您提供宝贵意见。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      方法 3 - 合并

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

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

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


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

      下面是 Clipper 的输出,它显示了白边。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-27
        • 2011-09-14
        • 2023-03-26
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        相关资源
        最近更新 更多