【发布时间】:2010-12-28 22:10:57
【问题描述】:
使用 Cairo,我将一些文本放置在随机位置,我需要知道它们是否与之前绘制的一些任意形状重叠。我可以将路径剪辑到以前的图纸,如果发生任何剪辑,则意味着存在重叠。但是,Cairo 似乎没有任何函数来判断是否发生了剪裁。
有什么方法可以轻松完成我想要的吗?我想我基本上只是想看看两个形状是否相交。
【问题讨论】:
使用 Cairo,我将一些文本放置在随机位置,我需要知道它们是否与之前绘制的一些任意形状重叠。我可以将路径剪辑到以前的图纸,如果发生任何剪辑,则意味着存在重叠。但是,Cairo 似乎没有任何函数来判断是否发生了剪裁。
有什么方法可以轻松完成我想要的吗?我想我基本上只是想看看两个形状是否相交。
【问题讨论】:
根据您想要获得的质量,您可以使用cairo_stroke_extents、cairo_fill_extents 和cairo_text_extents 并在边界框上工作。
更好的方法是仅计算文本的边界框,并使用cairo_in_fill 或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() 操作给定 当前路径和行程参数"
这没什么用。除非我们暂时将线宽设置得如此之宽,以至于路径开始增加面积。
测试区域并不完全是边界框,而是近似它的重叠圆链。如果你想安全起见,添加线宽将确保边界框真的不会被触及。
如果我得到这个方法来真正做到这一点(以及它变得多快),我会报告。
【讨论】: