C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++でのKleeのアルゴリズム(行のセグメントの結合の長さ)


このチュートリアルでは、行のセグメントの和集合の長さを見つけるプログラムを作成します。

線分の始点と終点が与えられ、線分の和集合の長さを見つける必要があります。

これから使用するアルゴリズムは、kleeのアルゴリズムと呼ばれます。

問題を解決するための手順を見てみましょう。

  • すべてのセグメントの座標を使用して配列を初期化します。
  • セグメント配列の2倍のサイズのポイントと呼ばれるベクトルを初期化します。
  • セグメント配列を反復処理します。
    • インデックスi*2のpoints配列の値に、現在のセグメントの最初のポイントを入力し、falseを入力します。
    • インデックスi*2 + 1のpoints配列の値に、現在のセグメントの2番目のポイントを入力します。false。
  • ポイント配列を並べ替えます。
  • カウンタ変数を使用してpoints配列を反復処理します。
    • カウンターが0より大きい場合は、iとi-1の最初のポイントを結果に追加します。
    • 2番目のポイントがある場合はカウンターをデクリメントし、それ以外の場合はカウンターをインクリメントします。
  • 結果を返します。

コードを見てみましょう。

#include<bits/stdc++.h>
using namespace std;
int segmentUnionLength(const vector<pair <int,int>> &segments) {
   int n = segments.size();
   vector<pair<int, bool>> points(n * 2);
   for (int i = 0; i < n; i++) {
      points[i*2] = make_pair(segments[i].first, false);
      points[i*2 + 1] = make_pair(segments[i].second, true);
   }
   sort(points.begin(), points.end());
   int result = 0, count = 0;
   for (int i = 0; i < n * 2; i++){
      if (count) {
         result += points[i].first - points[i-1].first;
      }
      points[i].second ? count-- : count++;
   }
   return result;
}
int main() {
   vector<pair<int,int>> segments;
   segments.push_back(make_pair(1, 3));
   segments.push_back(make_pair(2, 7));
   segments.push_back(make_pair(6, 12));
   segments.push_back(make_pair(13, 5));
   cout << segmentUnionLength(segments) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

6

結論

チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。


  1. C++のコンピュータグラフィックスにおけるポイントクリッピングアルゴリズム

    コンピュータグラフィックスは、コンピュータ画面に画像やグラフィックスを描画することを扱います。ここでは、画面を2次元座標系として扱います。この座標系は左上(0,0)から始まり、右下で終わります。 表示平面 コンピュータグラフィックスでグラフィックスを描画するために定義された領域です。または画面の表示領域。 クリッピングとは、表示面の外側にあるポイントまたはグラフィックを削除することです。 クリッピングを理解するために例を見てみましょう。 ここで、ポイントCとDは、青色でマークされた表示平面の外側にあるため、クリップされます。 コンピュータグラフィックスのポイントをクリップするた

  2. C++で線が円に接触または交差するかどうかを確認します

    円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$