2

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

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

4

4 回答 4

3

根据您想要获得的质量,您可以使用和cairo_stroke_extents处理边界框。cairo_fill_extentscairo_text_extents

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

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

于 2009-10-20T19:41:18.637 回答
2

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

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

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

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

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

于 2009-10-19T19:08:00.850 回答
1

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

于 2009-10-20T17:19:42.950 回答
0

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

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

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

cairo_in_stroke 本身只告诉

“给定点是否在受当前路径和描边参数的 cairo_stroke() 操作影响的区域内”

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

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

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

我会报告我是否有这种方法来真正做到这一点(以及它变得多快)。

于 2010-12-28T13:58:20.117 回答