どのように私はポリゴンの厚2Dラインをレンダリングするのですか?

StackOverflow https://stackoverflow.com/questions/687173

質問

私は、2D点のリストで構成されたパスを持っています。私は特定の厚さ(および他のようなもの)とテクスチャラインを描画するために、三角形のストリップにこれらを有効にします。だから、基本的に2Dポイントのリストがあれば、レンダリングはラインを描画することをポリゴンのアウトラインを指定する頂点のリストになる必要があります。問題が加わり、miters、キャップなどのコーナーを処理している、それが実行可能に押し出すこと、あるいはでおもちゃにすることができるように結果のポリゴン等、加入クリーン、無オーバードローの意味で「完璧」にする必要があります。

があることを周りのすべてののシンプルなのリソースは、アルゴリズムの洞察力、コード、またはこれを効率的に行う上の任意のより多くの情報を提供することができますか?

私は絶対に曲線、円弧、ダッシュ、すべての添えものと本格的な2Dベクターライブラリー(カイロなどantigrain、のOpenVGを)望んでいません。私はいくつかの洞察を発見するのOpenVGの実装や他のもののために複数のソースツリーに掘ってきたが、それはすべてひどく複雑です。

私は間違いなくそれを自分でコーディングして喜んだけど、多くの縮退例の参加問題のすべての種類を作成します(小さなセグメント+太い幅+鋭いコーナー)があります。少しでも助けは私にそれらすべてに対処しようとしているの時間を救うます。

編集:ここでは、頂点に頂点から行くために、単純であれば醜さの原因となるものを縮退例1の例です。赤は元のパスです。オレンジ色のブロックは、各セグメントに整列し、中心に所定の幅で描かれた矩形である。

役に立ちましたか?

解決

まあ - 私はその問題を自分で解決しようとしました。私はゼロオーバードローの問題を解決しようとしたソリューションに2ヶ月を無駄にしました。あなたは既に出て発見したとして、あなたはすべての縮退のケースに対処すると同時に、ゼロオーバードローを持っていないことができます。

ただし、ハイブリッドアプローチを使用することができます:

自分自身の問題もなく、単純な幾何学から構築することができる参加するかどうかを確認するルーチンを書きます。あなたが参加し、角度をチェックする必要がそうするために、線の幅と参加しましたラインセグメントの長さ(その幅より短いラインセグメントは面倒くさです)。いくつかのヒューリスティックを使用すると、すべての些細な例を整理することができる必要があります。

私はあなたの平均ラインのデータがどのように見えるかわからないが、私の場合には幅の広いラインの90%以上が、何の縮退例がありませんでした。

他のすべての行を示します。

あなたはおそらくすでにあなたはオーバードロー容認場合、ジオメトリを生成することは非常に簡単であることが判明しました。そう、ポリゴンCSGアルゴリズムとテッセレーションアルゴリズムは、ハード仕事をしてみましょう。

私は、利用可能なテッセレーションパッケージのほとんどを評価されてきた、と私はGLUのtesselatorになってしまいました。これは、(他のほとんどのアルゴリズムとは違って)クラッシュしたことがない、堅牢で、速かったです。それは無料だったとのライセンスは私が商用プログラムに含めることができました。テッセレーションの品質とスピードは大丈夫です。あなたは、ドロネー三角形分割の品質を得ることはありませんが、あなただけのレンダリングのための三角形を必要とするので、それは問題ではありません。

私は自由なSGI OpenGLのリファレンス実装からテッセレーションコードを持ち上げtesselator APIを嫌っているので

、全体のフロントエンドを書き直しダウン割り当ての数を取得するためにメモリ・プールを追加しました。これを行うために二日かかりましたが、それはそれ(ファクター5つのパフォーマンスの向上など)だけでなく価値がありました。解決策は、ところで、商用のOpenVGの実装で終わった: - )

あなたがPC上でのOpenGLでレンダリングしている場合は、CPUからGPUにテッセレーション/ CSGジョブを移動し、オーバードローを削除するにはステンシルバッファまたはzバッファトリックを使用することもできます。それは非常に簡単だとCPUのテッセレーションよりもさらに速いかもしれません。

他のヒント

私の頭の上から簡単な方法。

これは素敵なマイターラインを作成し、各2D頂点の角度を二等分します。その後、両方の内側と外側に、その線に沿って移動し、あなたの「厚さ」の量(2で割っまたは厚さ?)、あなたが今、あなたの内側と外側のポリゴンのポイントを持っています。道に沿ってあなたの新しいポリゴンのポイントを構築し、同じプロセスを繰り返して、次のポイントに移動します。次に、あなたのレンダリング対応の頂点を取得するためにtriangualtionを適用します。

私はこの素晴らしい仕事を見つけます:

http://www.codeproject.com/Articles/226569/描画・ポリライン・バイ・テッセレーションする

あなたが望むものを正確に行うように思われ、そのライセンスがさえ商用アプリケーションでそれを使用することができます。さらに、著者は彼の方法を詳細に本当に素晴らしい仕事をしました。私はおそらく自分ではない、ほぼ-として完璧な実装を置き換えるためにいくつかの点で、それに打撃を与えるでしょう。

私は私の手を汚すと同様の問題を解決するために、小さなribbonizerを書くためになってしまった。

私にとっての問題は、私はiPhone上でのOpenGLで見ていた成果物の種類を持っていなかったOpenGLで脂肪のラインを望んでいたということでした。様々なソリューションを見た後、ベジェ曲線など - 私はそれだけで私自身の作るために、おそらく一番簡単だと思ったようです。異なるアプローチがいくつかあります。

一つのアプローチは、2つのセグメント間の交差の角度を見つけて、そのリボン頂点として一定距離離れた面からその交線に沿って移動して処理することです。私はそれを試してみましたが、それが直感的に見ていませんでした。リボンの幅が異なります。

別のアプローチは、実際にはラインセグメントの表面の法線を計算し、そのセグメントのための理想的なリボンのエッジを計算すると、リボン・セグメント間の実際の交差テストを行うためにそれを使用することです。これは、リボン線分の交点は、(セグメント間の角度が180' に近づいた場合)。

離れすぎた鋭い角のそれ以外はうまく

私は2つのアプローチと鋭い角度の問題を中心に働きました。 (私は最適化されていない方法で使用される)ポール・バークライン交差アルゴリズムは、交差点は、セグメントの中にあったかどうかを検出示唆しました。両方のセグメントが同一であるので、私は交差点のためのセグメントのいずれかをテストするために必要。私は、これを解決する方法を仲裁することができ;どちらかの両端間またはエンドキャップを装着することにより、最良点をfudgingことで - 両方のアプローチはよく見る - 。エンドキャップアプローチをバックopenglのための発注が直面している/多角形のフロントをオフに投げることがあります。

を参照してください。 http://paulbourke.net/geometry/lineline2d/する

https://gist.github.com/1474156する ここに私のソースコードを参照してください。 >

私は完璧にしたいので、私は、あまりにもこのことに興味が私のマッピングアプリケーションの(コスモス道路の)描画。私が使用した回避策の一つは、異なる色で、シンナーで一回太い線とし、1回、2回ポリラインを描画することです。しかし、これは本当に多角形ではない、それは1をシミュレートするだけの簡単な方法です。ここではいくつかのサンプルを参照してください: http://wiki.openstreetmap.org/wiki/Kosmos_Rendering_Help#Rendering_Options

私は、これは何が必要であるかはわからない。

私は、テッセレーションアルゴリズムに達するだろうと思います。それはほとんどの場合、これらは目的がレンダリングを最適化するために、頂点の数を減らすことですが、あなたのケースでは、すべてのディテールを保持するparameterise可能性が使用されているところというのは本当だ - 。と最適化の可能性が有用で来るかもしれない。

数多くのテッセレーションアルゴリズムと周りのコードがウェブ上であります - 私は、Delphiの風景レンダラで使用するために、数年前にDLLでの純粋なCを包んで、彼らはチュートリアルをコーディング高度なグラフィックスのための珍しい対象ではありませんし、同様ます。

Delaunay三角形分割を助けることができるの場合は、

を参照してください。

私の場合は、オーバードローする余裕ができます。 I半径だけドラウ円=幅/ 2ポリラインの頂点のそれぞれを中心とする。

アーティファクトは、このようにマスクされ、そしてあなたは「丸い」コーナーといくつかの描き一緒に暮らすことができるかどうかは、実装するのは非常に簡単です。

あなたは上のFILLとラインセグメントの周りにボックスを描画し、オレンジ色を使用しているように、

あなたのイメージから、それが見えます。そうすることは確かに悪いoverdrawsを作成しようとしています。だから、まず最初に行うには、黒の境界線を描画し、色が不透明であってもよい記入しないだろう。

なぜあなたはあなたが意図何をすべきかを行うことがプリミティブGL_LINESを使用することはできませんか?あなたは幅、フィルタリング、平滑度、テクスチャ何も指定することができます。あなたはglDrawArrays()を使用して、すべての頂点をレンダリングすることができます。私は、これはあなたが考えているものではありません知っていますが、2次元図面に焦点を当てているように、これは容易なアプローチであるかもしれません。 (テクスチャ線などを検索する。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top