【问题标题】:Cairo test if text overlapsCairo 测试文本是否重叠
【发布时间】:2010-12-28 22:10:57
【问题描述】:

使用 Cairo,我将一些文本放置在随机位置,我需要知道它们是否与之前绘制的一些任意形状重叠。我可以将路径剪辑到以前的图纸,如果发生任何剪辑,则意味着存在重叠。但是,Cairo 似乎没有任何函数来判断是否发生了剪裁。

有什么方法可以轻松完成我想要的吗?我想我基本上只是想看看两个形状是否相交。

【问题讨论】:

    标签: drawing cairo


    【解决方案1】:

    根据您想要获得的质量,您可以使用cairo_stroke_extentscairo_fill_extentscairo_text_extents 并在边界框上工作。

    更好的方法是仅计算文本的边界框,并使用cairo_in_fillcairo_in_stroke 检查最后一条路径的四个角。最大误差是从单个字形的形状到其边界框的距离,但也许这足以满足您的目的。

    最后一个选项是展平文本并像上一步一样检查任何单个点。

    【讨论】:

    • 您的建议不够准确,因此。但感谢您指向 cairo_in_stroke。通过调整笔画的宽度以匹配文本边界框的尺寸,可以建立一个适当快速和可靠的机制。有关我对此的进一步回答,请参见下文。并感谢您的指点。 :)
    【解决方案2】:

    我什么都没看到——至少,没有什么简单的——如果没有任何东西,我也不会感到惊讶。 Cairo 旨在栅格化矢量绘图操作,而不是交集测试。

    但是,如果我要查看两条文本是否重叠,我会这样做:

    1. 选择适合我的 Cairo 后端 测试环境 - 例如Xlib 等 - 并使用我的屏幕外表面 可以用来做一个逐像素的 分析。
    2. 以 100% alpha 的纯蓝色绘制第一段文本。
    3. 以 50% alpha 的纯红色绘制第二段文本。
    4. 扫描表面,寻找红色和蓝色均非零的像素。

    这是相当蛮力的,但它甚至可以应对抗锯齿。我之前在 X 上使用 GTK 做过类似的事情(出于不同的目的),它间接使用了 Cairo。

    如果您不想这样做,并且 Cairo 不提供 API,您可以添加一个。那可能会很困难;在此之前,您可能想与 Carl Worth 谈谈。

    【讨论】:

    • 好吧,开罗有很多交叉点检查代码,这就是裁剪的全部内容,对吧?代码肯定在那里,只是没有向用户公开。我将像您建议的那样采用基于光栅的解决方法,但它看起来仍然有点傻。哦,Cairo 不仅仅针对光栅化,它也可以很好地输出矢量格式。我想说 Cairo 是一个基于矢量的绘图库,必须通过光栅图像来完成一些简单的事情似乎有点傻。
    • pafcu,我同意光栅图像路由不优雅。但是根据要求,有时可行但不优雅的解决方案是可取的,如果它可以更快地实施。我偶尔需要处理硬盘驱动器并需要确保无法读取其中包含的敏感数据。优雅但耗时的方法是使用随机数据进行 7 倍或 35 倍的重写。相反,我只是把它们带到我的混凝土露台上,用大锤或镐敲打它们几次。
    • Bob,你能提醒我哪个 Cairo API 提供逐像素迭代。我有它的记忆,但找不到它。附录:它是 cairo_image_surface_get_data()
    【解决方案3】:

    我通过使用 Qt 进行渲染解决了这个问题。它似乎对不同的路径操作有相当广泛的支持,并且支持 PDF 和 SVG 输出。

    【讨论】:

      【解决方案4】:

      我的情况几乎相同,我认为有办法做到这一点。

      我的问题是查找文本边界框是否与绘制在表面上的一组复杂线(可能是平滑线)相交。这目前是一个瓶颈,快速的交叉路口处理可能会将 sw 速度提高 100 倍。谁知道呢。

      无论如何,多亏了 ntd 提到了cairo_in_stroke,我开始扭转这个问题。事情是这样的。

      cairo_in_stroke 本身只告诉

      "给定点是否在 会受到影响的区域 cairo_stroke() 操作给定 当前路径和行程参数"

      这没什么用。除非我们暂时将线宽设置得如此之宽,以至于路径开始增加面积。

      1. 将线宽设置为边界框高度的一半(我们称之为 X)
      2. 测试位置 X,2X,... 从两侧进入边界框,直到它们在中心相遇

      测试区域并不完全是边界框,而是近似它的重叠圆链。如果你想安全起见,添加线宽将确保边界框真的不会被触及。

      如果我得到这个方法来真正做到这一点(以及它变得多快),我会报告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 2012-12-10
        • 1970-01-01
        • 2016-05-15
        相关资源
        最近更新 更多