2

Cairo を使用して、テキストをランダムな位置に配置しています。以前に描画した任意の形状と重なっているかどうかを知る必要があります。前の図面へのパスをクリッピングできます。クリッピングが発生した場合は、オーバーラップがあることを意味します。ただし、カイロには、クリッピングが発生したかどうかを判断する機能がないようです。

私がやりたいことを簡単に達成する方法はありますか?基本的には、2 つの形状が交差するかどうかを確認したいだけだと思います。

4

4 に答える 4

3

取得したい品質に応じて、cairo_stroke_extents、 、cairo_fill_extentsおよびを使用cairo_text_extentsして境界ボックスを操作できます。

より良いアプローチは、テキストの境界ボックスのみを計算し、cairo_in_fillまたはを使用して最後のパスに対して 4 つのコーナーをチェックすることcairo_in_strokeです。最大誤差は、単一のグリフの形状からそのバウンディング ボックスまでの距離ですが、目的にはこれで十分かもしれません。

最後のオプションは、テキストを平坦化し、前の手順のように単一のポイントをチェックすることです。

于 2009-10-20T19:41:18.637 に答える
2

私には何も見えません-少なくとも、単純なものは何もありません-そして何もなかったとしても驚かないでしょう。Cairoは、交差テストではなく、ベクトル描画操作をラスタライズすることを目的としています。

ただし、2つのテキストが重なっているかどうかを確認する場合は、次のようにします。

  1. テスト環境に適したCairoバックエンド(Xlibなど)を選択し、ピクセルごとの分析に使用できるオフスクリーンサーフェスを使用します。
  2. 最初のテキストを100%アルファの青一色で描画します。
  3. 2番目のテキストを50%アルファの赤一色で描画します。
  4. 表面をスキャンして、赤と青の両方がゼロ以外のピクセルを探します。

それはかなり野蛮な力ですが、アンチエイリアシングにも対処します。私は以前に(別の目的で)カイロを間接的に使用するX上のGTKでそのようなことをしました。

そのようにしたくなく、CairoがAPIを提供していない場合は、APIを追加できる可能性があります。それはおそらく難しいでしょう。その前にCarlWorthと話したいと思うかもしれません。

于 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 に答える