使用 Cairo,我将一些文本放置在随机位置,我需要知道它们是否与之前绘制的一些任意形状重叠。我可以将路径剪辑到以前的图纸,如果发生任何剪辑,则意味着存在重叠。但是,Cairo 似乎没有任何功能来判断是否确实发生了削波。
有什么方法可以轻松完成我想要的吗?我想我基本上只是想看看两个形状是否相交。
根据您想要获得的质量,您可以使用和cairo_stroke_extents
处理边界框。cairo_fill_extents
cairo_text_extents
cairo_in_fill
更好的方法是仅计算文本的边界框,并使用or检查最后一条路径的四个角cairo_in_stroke
。最大误差是从单个字形的形状到其边界框的距离,但这可能足以满足您的目的。
最后一个选项是展平文本并像上一步一样检查任何单个点。
我什么都没看到——至少,没有什么简单的——如果没有任何东西,我也不会感到惊讶。Cairo 旨在光栅化矢量绘图操作,而不是交叉测试。
但是,如果我要查看两条文本是否重叠,我会这样做:
这是相当蛮力的,但它甚至可以应对抗锯齿。我之前在 X 上使用 GTK 做过类似的事情(出于不同的目的),它间接使用了 Cairo。
如果您不想那样做,并且 Cairo 不提供 API,您可以添加一个。那可能会很困难;在此之前,您可能想与 Carl Worth 谈谈。
我通过使用 Qt 进行渲染解决了这个问题。它似乎对不同的路径操作有相当广泛的支持,并且支持 PDF 和 SVG 输出。
我的情况几乎相同,我认为有办法做到这一点。
我的问题是查找文本边界框是否与在表面上绘制的一组复杂的线(可能是平滑的)相交。这目前是一个瓶颈,快速的交叉路口处理可能会将 sw 速度提高 100 倍。谁知道。
无论如何,由于 ntd 提到了cairo_in_stroke ,我开始扭转这个问题。事情就是这样。
cairo_in_stroke 本身只告诉
“给定点是否在受当前路径和描边参数的 cairo_stroke() 操作影响的区域内”
这很没用。除非我们暂时将线宽设置得如此之宽,以至于路径开始获得面积。
测试区域不完全是边界框,而是近似它的重叠圆链。如果你想安全起见,添加线宽将确保边界框真的不会被触及。
我会报告我是否有这种方法来真正做到这一点(以及它变得多快)。