曲線セグメントの直線性の測定(ポリラインとして表されます)


11

自動標高等高線ラベリングアルゴリズムに取り組んでおり、ラベルの位置を決定する際に考慮したい要因の1つは、等高線の特定のセグメントがどの程度「真っ直ぐ」であるかです。直線であるほど、そのセグメントにラベルを配置するために使用される可能性が高くなります。

各輪郭はポリラインで表されます(ただし、肉眼では曲線のように見えるように点が互いに近接しています)。次に、固定長(ラベルの幅)、たとえば100ピクセルを使用します。幅が100ピクセルの輪郭セグメントをランダムに(または別の方法で)選択した場合、その真直度の定量的な数値(完全に真っ直ぐな輪郭セグメントの場合はゼロ、そうでない場合はゼロより大きい値)を取得できるようにしたい直線セグメントであり、この値は曲がり具合が増加するにつれて増加します)。

私は答えを探しましたが、本当に役立つものは見つかりませんでした。どんなポインターにも感謝します。

回答:


9

答えはコンテキストに依存します。少数の(制限された)セグメントのみを調査する場合、計算コストの高いソリューションを購入できる可能性があります。ただし、適切なラベルポイントを検索する何らかの種類の検索にこの計算を組み込むことをお勧めします。そうである場合、計算が高速であるか、候補線分がわずかに変化したときにソリューションを迅速に更新できるソリューションがあれば非常に有利です。

たとえば、体系的な検索を行うと仮定します点のシーケンスP(0)、P(1)、...、P(n)として表される、輪郭の接続されたコンポーネント全体にわたる。これは、1つのポインター(シーケンスへのインデックス)s = 0( "start"の "s")と別のポインターf( "finish")をdistance(P(f)、 P(s))> = 100、その後distance(P(f)、P(s + 1))> = 100の間sを進めます。これにより、候補ポリライン(P(s)、P(s + 1)...、評価用のP(f-1)、P(f))。ラベルをサポートするための「適合性」を評価したら、sを1ずつ増やし(s = s + 1)、fを(たとえば)f 'に、sをs'に増やして、もう一度候補ポリラインが最小値を超えるようにします。スパン100が生成され、(P(s ')、... P(f)、P(f + 1)、...、P(f'))として表されます。そうすることで、頂点P(s)... P(s ' ドロップされた頂点と追加された頂点のみの知識からフィットネスを迅速に更新できることが非常に望ましい。 (このスキャン手順はs = nまで継続されます。通常どおり、プロセスでnから0に戻るためにfを「ラップアラウンド」する必要があります。)

フィットネスの多くの可能な措置アウトこの考慮事項規則引き回しねじれそう魅力的かもしれないなど、)。通常、基礎となるデータがわずかに変更されたときに迅速に更新できるため、L2ベースのメジャーを優先します。主成分分析との類似性をとることにより、次の測定値を楽しませることが示唆されます(要求に応じて、小さい方が良い場合):共分散行列の 2つの固有値のうち小さい方を使用するポイント座標の。幾何学的に、これは、ポリラインの候補セクション内の頂点の「典型的な」左右の偏差の1つの尺度です。(1つの解釈は、その平方根は、ポリラインの頂点の2次慣性モーメントを表す楕円の小さい半軸であるということです。)同一直線上の頂点のセットに対してのみゼロに等しくなります。そうでない場合、ゼロを超えます。ポリラインの開始と終了によって作成された100ピクセルのベースラインを基準にした左右の平均偏差を測定するため、簡単に解釈できます。

共分散行列は2 x 2のみであるため、単一の2次方程式を解くことで固有値をすばやく見つけることができます。さらに、共分散行列は、ポリラインの各頂点からの寄与の合計です。したがって、ポイントがドロップアウトまたは追加れると急速に更新され、nポイントの輪郭のO(n)アルゴリズムにつながります。これは、アプリケーションで想定される非常に詳細な輪郭にうまく対応します。

このアルゴリズムの結果の例を次に示します。黒い点は輪郭の頂点です。赤い実線は、その輪郭内でエンドツーエンドの長さが100を超えるポリラインセグメントの最良の候補です。(右上の視覚的に明らかな候補は、十分な長さではありません。)

図


うわー、あなたは私がそこに迷子になった:)。体系的な検索については正しいです。各ポリライン/ポリゴンの頂点の接線を取得するために既にそれを行う必要があります(水平ラベルが垂直のものよりも好ましい)。ところで、実際のアルゴリズムを使用して、または手動でサンプルプロットを作成しましたか?
イゴールブレッチ

1
実例は実在しますが、私が使用した実装は共分散更新手順を使用していないため、計算的に最適ではありません。
whuber

2
最後に、グラフ、この答えはもっとすごいます
Ragi Yaser Burhum

2
イゴール、ラベルの方向は無料です。楕円の長軸の方向(より大きな固有値に関連付けられた固有ベクトル)によって与えられます。したがって、ラベルの向きと輪郭セクションの直線性の最適な組み合わせを効率的に同時に検索できます。
whuber

3

コンピュータグラフィックスコミュニティでは、多くの場合、オブジェクトの周囲の境界ボックスを見つける必要があります。その結果、それは高速アルゴリズムでよく研究された問題です。たとえば、ウィキペディアの最小境界ボックスアルゴリズムの記事を参照してください。ポリラインを囲む最小面積の長方形を見つけて、長方形のアスペクト比である高さ/長さを使用できます。より正確な測定値を取得するには、この境界矩形の中心線からのポリラインの偏差を調べることができます。


1
minの使用を考えました。境界ボックスですが、2つの問題があります:a)実際に最小になる(したがって回転する)ボックスを計算する計算の複雑さ、b)同じアスペクト比を持つ2つの曲線セグメントは、非常に異なる曲率を持つ可能性があります(正弦波のように思われます)振幅は同じですが、波の周期が異なる曲線)。
イゴールブレッチ

1
GISページでここでお会いできてうれしいです、ジョセフ!
whuber

1
はい、私は今:)私の手の中にあなたの「計算幾何学Cで」本を持っている
イゴールBrejc

1
みなさん、歓迎してくれてありがとう!:-)私の提案は理想的な尺度ではないことを理解していますが、コーディングは既製です(適切な棚がある場合)。この種の問題は、機械加工部品の品質を測定する必要がある製造の文脈でかなり研究されてきました。
ジョセフ・オルーク

3

これが役立つかどうか、あるいは答えとしてカウントされるかどうかはわかりませんが、ここに座ったばかりの質問について考えていたとき、私は考えました:

等高線上に特定の半径の円を配置するとどうなりますか。その円は、少なくとも2箇所で等高線と交差します。直線が直線になるほど、2つの交点間の等高線に沿った距離が短くなります。交点間の等高線に沿った距離が長いほど、線はより湾曲します。3つ以上の交点がある場合、等高線は非常に曲線的です。

どの長さが真直度の最良の指標を与えるかを把握し、各等高線に沿ってステップするルーチンを設定し、それが十分に真っ直ぐな場所にラベルを配置します。

これはあまり役に立たないと思いますし、私が英語で言うことは、あなたが使用しているプログラミング言語が何であれ、はるかに難しいのですが、それは始まりでしょうか?


面白いアイデア。より簡単にするために、片側のセグメントの長さと開始点と終了点の間の距離の比率を計算できます。それほど正確ではありませんが、計算は簡単です。そして、円を使用するという考えは、真直度のより正確な計算を可能にします。
イゴールブレッチ

3

私が考えることができる最も簡単なアプローチは、開始点と終了点の間の実際のパスの長さと、開始点から終了点までの最短距離(直線)の比率です。直線の比率は1に近く、曲線の比率は非常に高くなります。

これは、実装が非常に簡単なソリューションでなければなりません。


更新:マイクが正しく気付いたように、これはSinuosityに等しくなります。

ここに画像の説明を入力してください


レックスの答えを読んだ後に私の頭に浮かんだこと:)
イゴールブレジュ

4
基本的に
マイクT

正確に:) ....
暗闇

2
ラベル付けする適切なセグメントを検索するときに長さを更新することは、連続する頂点間で長さを加算および減算するのと同じくらい簡単なので、これは実装が簡単だということです。ただし、湾曲は、曲線が直線性から逸脱する可能性があるという意味を効果的に捉えていません。たとえば、直径100 の半円を直径1の半円の線形シーケンスと比較します。両方の曲線は同じ正弦曲線を持ちますが、最初の曲線の左右の偏差は2番目の曲線の 100倍です(これはいいベースです)ラベル用)。
whuber

ポリラインが円を描く場合、この方法は無限の湾曲を与えますが、これはおそらく望ましい結果ではないことを考慮してください。
obchardon

1

「曲率」と「ポリライン」を検索すると、この情報が得 られました。ポリラインの曲率を見つけるにはどうすればよいですか?。そこで彼は、湾曲の定義に戻ることを使用することを提案しました- K= DF/Ds。ここでF彼はphi、またはTウィキペディアの表記法(http://en.wikipedia.org/wiki/Curvature)を意味します。

シーケンス3点、p0、p1、p2があるとします。ポイントが互いに十分に近いと仮定してs、p0とp1の間の距離を計算します。これはs(Ds)のデルタです。次に、Tのデルタ(DT)が必要です。これは、p0とp1の間の単位接線ベクトルの変化です。洗練された方法があるかもしれませんが、粗い方法iは、2つのbector p0-> p1、p1-> p2を取り、それぞれを長さ1に正規化してから、それら2つのベクトル減算を行い、大きさを決定することを考えることができます。それはDT。分割により曲率が得られK0_1ます。p1、p2、p3を取得K1_2して計算するなど。

輪郭をレンダリングされたピクセルとしてではなく、ポリラインとして取得するかどうかは疑問です。あなたは100pxと言ったので、少し心配しています。


リンクのおかげで、私はその背後にある数学を勉強する必要があります。レンダリングされたラベルテキストが特定の幅(ピクセル単位)であるため、100pxに言及しましたが、100pxは単なる例です。
イゴールブレッチ

曲率を考えるのは良い考えです。十分な長さの非常に滑らかな輪郭部分の曲率は適切かもしれませんが、曲率自体は適切ではありません。たとえば、1つの小さなジグザグは非常に高い曲率を持ちますが、全体的には重要ではありません。したがって、実際には、ポリラインのセクション全体の直線性からの偏差の統計的な要約を使用することになります。有望な候補の中で、曲率は実行するより複雑な計算の1つです。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.