6

編集:タイトルを変更しました。2 つのセグメントが同じであることにはあまり関心がありませんが、特定の許容範囲内で互いに同一線上にある場合はそうです。その場合、線は 1 つのセグメントとしてまとめてクラスター化する必要があります。

編集:これを簡単に言うと、同様の線分を効率的な方法でまとめようとしています。

線分があるf (fx0, fy0)とします(fx1, fy1)and and and g (gx0, gy0)and(gx1, gy1)

これらは、コンピューター ビジョン アルゴリズムのエッジ検出器のようなものから得られます。場合によっては、2 つの線は基本的に同じですが、ピクセル許容誤差のために 2 つの異なる線としてカウントされます。

いくつかのシナリオがあります

  • fgまったく同じエンドポイントを共有します。例:f = (0,0), (10,10) g = (0,0), (10,10)
  • fgほぼ同じエンドポイントとほぼ同じ長さを共有します。たとえば、次のようになります。f = (0,0.01), (9.95,10) g = (0,0), (10,10)
  • fは のサブセットですg。つまり、その終点はセグメント内にあり、gセグメントと同じ勾配を共有しgます。ペンを前後に動かして太くしたラフな線を考えてみてください。例:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)

以下は同じとは見なされません。

  • fg一定以上の勾配差があるtolerance
  • fgは同じ勾配を持っているかもしれませんが、 を超える距離だけ離れていますtolerance。つまり、平行線です。
  • fg同じ平面と同じ勾配にありますが、まったく重なっていません...つまり、破線内の一連のセグメントです。

それらが同じかどうかを判断する最も簡単な方法は、if gx1 - fx1 <= tolerance(他の 3 つの点について繰り返します) ですが、場合によっては、線が線fよりも短い場合がありますg(これも、ピクセルの違いや写真のスキャンが不十分なためです)。

では、2 つの線分を極座標に変換して角度を比較したほうがよいのでしょうか? その場合、2 つの rho は許容範囲内になります。ただし、2 つの線分が同じ「方向」を持っていることを確認する必要があります。これは、デカルト座標または極座標で計算するのは簡単です。

これは方法を理解するのは簡単ですが、私が長い間忘れていた線形代数に基づいた、よりクリーンな方法があるかどうか疑問に思っています。

4

3 に答える 3

2

座標を使用して直線の方程式を定義できますか? もしそうなら、連立方程式で2つの方程式を使用し、システムを解いて、線が交差するかどうか、またどこで交差するかを調べることができます. 線がまったく交差しないが、それらの間の距離が非常に小さい場合、または許容範囲内であれば、それらを 1 本の線と見なすことができます。

于 2012-07-10T18:01:22.530 に答える
2

問題は 2 つあります。長さの違いと角度の違いの両方を比較したいのです。長さの差を計算するには、最初の線の長さを 2 番目の線の長さで割ります。

角度の違いを取るには、atanまたは、私のお気に入りを使用できます。

angle = acos(abs((u dot v)/(u.length * v.length)))

うまくいけば、これが役に立ちます。先程は間違った回答で申し訳ありません。

古い答え:

ここにアイデアがあります: 2 つの線分の始点と終点の差を、一方の線分の全長と比較してみませんか? 次に、差分関数は次のようになります。

def difference(Line l1, Line l2):
    # Distance between first point on first line and first point on second line
    first_point_diff = (Line(l1.x1, l2.x1, l1.y1, l2.y1).length())

    # Distance between first point on first line and first point on second line
    second_point_diff = (Line(l1.x2, l2.x2, l1.y2, l2.y2).length())

    return (first_point_diff + second_point_diff)/l1.length()

この関数は、最初の行の全長に対する割合として、2 つの行の「差」を返します。

于 2012-07-10T17:45:32.483 に答える
0

それらが同じ方向にあるかどうかを確認することだけが必要な場合は、内積を大きさで割ったものを考えてみませんか? 1 に近いほど、2 つの線の位置合わせが近くなります。

于 2012-07-10T19:09:48.960 に答える