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