Cairo を使用して、テキストをランダムな位置に配置しています。以前に描画した任意の形状と重なっているかどうかを知る必要があります。前の図面へのパスをクリッピングできます。クリッピングが発生した場合は、オーバーラップがあることを意味します。ただし、カイロには、クリッピングが発生したかどうかを判断する機能がないようです。
私がやりたいことを簡単に達成する方法はありますか?基本的には、2 つの形状が交差するかどうかを確認したいだけだと思います。
取得したい品質に応じて、cairo_stroke_extents
、 、cairo_fill_extents
およびを使用cairo_text_extents
して境界ボックスを操作できます。
より良いアプローチは、テキストの境界ボックスのみを計算し、cairo_in_fill
またはを使用して最後のパスに対して 4 つのコーナーをチェックすることcairo_in_stroke
です。最大誤差は、単一のグリフの形状からそのバウンディング ボックスまでの距離ですが、目的にはこれで十分かもしれません。
最後のオプションは、テキストを平坦化し、前の手順のように単一のポイントをチェックすることです。
私には何も見えません-少なくとも、単純なものは何もありません-そして何もなかったとしても驚かないでしょう。Cairoは、交差テストではなく、ベクトル描画操作をラスタライズすることを目的としています。
ただし、2つのテキストが重なっているかどうかを確認する場合は、次のようにします。
それはかなり野蛮な力ですが、アンチエイリアシングにも対処します。私は以前に(別の目的で)カイロを間接的に使用するX上のGTKでそのようなことをしました。
そのようにしたくなく、CairoがAPIを提供していない場合は、APIを追加できる可能性があります。それはおそらく難しいでしょう。その前にCarlWorthと話したいと思うかもしれません。
代わりにQtをレンダリングに使用して問題を解決しました。さまざまなパス操作を非常に広範囲にサポートしているようで、PDFとSVGの両方の出力をサポートしています。
私はほぼ同じ状況にあり、これを行う方法があると思います。
私の問題は、テキストの境界ボックスが、サーフェス上に描画された複雑な線のセット(おそらく滑らかになっている)と交差するかどうかを見つけることです。これは現在のボトルネックであり、交差点の処理が速いと、SWがおそらく100倍高速になります。知るか。
とにかく、ntdがcairo_in_strokeについて言及したおかげで、私は問題をひねり始めました。つまりね。
cairo_in_stroke自体は通知するだけです
「指定されたポイントが、現在のパスとストロークパラメータを指定してcairo_stroke()操作の影響を受ける領域内にあるかどうか」
これはかなり役に立たない。線幅を一時的に広くして、パスが面積を増やし始めない限り。
テストされた領域は、正確には境界ボックスではなく、それを近似する円の重なり合うチェーンです。安全を確保したい場合は、線幅を追加することで、バウンディングボックスに実際に触れないようにすることができます。
この方法で実際にトリックを実行できるかどうか(およびどのくらいの速さになるか)を報告します。