3

説明

(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4)で表される長方形の4辺の座標を考える。この画像のように-

ここに画像の説明を入力

そして、txtファイルに保存された100000個の長方形の座標のセットがあります。たとえば、これは私のコードによって生成された16個の長方形の座標の値です-

#Rect    x1      y1      x2       y2        x3        y3      x4     y4        area

1     0.0000   0.0000   0.8147   0.0000   0.8147   0.1355   0.0000   0.1355   0.1104
2     0.8147   0.0000   1.0000   0.0000   1.0000   0.1355   0.8147   0.1355   0.0251
3     0.8147   0.1355   0.9058   0.1355   0.9058   0.8350   0.8147   0.8350   0.0637
4     0.0000   0.1355   0.1270   0.1355   0.1270   0.9689   0.0000   0.9689   0.1058
5     0.9058   0.1355   0.9134   0.1355   0.9134   0.2210   0.9058   0.2210   0.0006
6     0.9058   0.8350   1.0000   0.8350   1.0000   1.0000   0.9058   1.0000   0.0155
7     0.8147   0.8350   0.9058   0.8350   0.9058   1.0000   0.8147   1.0000   0.0150
8     0.1270   0.1355   0.6324   0.1355   0.6324   0.3082   0.1270   0.3082   0.0873
9     0.1270   0.9689   0.8147   0.9689   0.8147   1.0000   0.1270   1.0000   0.0214
10    0.0000   0.9689   0.1270   0.9689   0.1270   1.0000   0.0000   1.0000   0.0040
11    0.9134   0.1355   1.0000   0.1355   1.0000   0.2210   0.9134   0.2210   0.0074
12    0.9134   0.2210   1.0000   0.2210   1.0000   0.8350   0.9134   0.8350   0.0532
13    0.9058   0.2210   0.9134   0.2210   0.9134   0.8350   0.9058   0.8350   0.0047
14    0.6324   0.1355   0.8147   0.1355   0.8147   0.3082   0.6324   0.3082   0.0315
15    0.6324   0.3082   0.8147   0.3082   0.8147   0.9689   0.6324   0.9689   0.1205
16    0.1270   0.3082   0.6324   0.3082   0.6324   0.9689   0.1270   0.9689   0.3339

これらの座標は、この写真のように単位正方形をサブ長方形に分割します-ここに画像の説明を入力

最も近い長方形の例

上の図では、長方形 # 3 に最も近い長方形は、9、15、14、1、2、5、13、6、および 7 です。

長方形#9の場合、それらは-10、4、16、15、3、および7です。

私の問題

ここで、c/c++ を使用して、各四角形の最も近い四角形の数を計算したいと思います。どうすればいいですか?

編集:応答に基づいて

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;


struct Rectangle {
    double x1, y1;
    double x2, y2;
    double x3, y3;
    double x4, y4;
};




vector<double> get_touching_rectangles(Rectangle base, vector<Rectangle> rectangles) {


    for (auto it = rectangles.begin(); it != rectangles.end(); it++) {
        Rectangle other = *it;
        if (base == other) {
            continue; // This is our rectangle... skip it
        }
        // Top or bottom
        if ((other.x2 >= base.x1 && other.x1 <= base.x2) && (other.y1 == base.y3 || other.y3 == base.y1)) {
            ret.push_back(other);
            continue;
        }
        // Left or right
        if ((other.y3 >= base.y2 && other.y2 <= base.y3) && (other.x1 == base.x3 || other.x3 == base.x1)) {
            ret.push_back(other);
            continue;
        }
    }
    return ret;
}

int main(int argc, char const *argv[])
{
vector<Rectangle> rectangles;

//parse_txt_file(file, &rectangles); // Or whateer I need to do to parse that .txt file
ifstream inputFile;
inputFile.open("RectCoordinates.txt");

//std::vector<Rectangle> touching = 
get_touching_rectangles(rectangles.at(2) /* Rectangle #3 */, rectangles);

 inputFile.close();
    return 0;
}

わかりました、応答に基づいて上記のコードを書きます。しかし、次のエラーが表示されます-

    g++ -std=c++11 st5.cpp -o ssst5.cpp: In function ‘std::vector<double> get_touching_rectangles(Rectangle, std::vector<Rectangle>)’:
    st5.cpp:23:21: error: no match for ‘operator==’ in ‘base == other’
    st5.cpp:23:21: note: candidates are:
    In file included from /usr/include/c++/4.7/iosfwd:42:0,
                     from /usr/include/c++/4.7/ios:39,
                     from /usr/include/c++/4.7/ostream:40,
                     from /usr/include/c++/4.7/iostream:40,
                     from st5.cpp:1:
    /usr/include/c++/4.7/bits/postypes.h:218:5: note: template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&)
    /usr/include/c++/4.7/bits/postypes.h:218:5: note:   template argument deduction/substitution failed:

st5.cpp:28:13: error: ‘ret’ was not declared in this scope
st5.cpp:33:13: error: ‘ret’ was not declared in this scope
st5.cpp:37:12: error: ‘ret’ was not declared in this scope

私は何を間違っていますか?

4

4 に答える 4

1

問題を反転します。長方形を生成するとき、n 個のタプル (n は 2 から 4 の間で変化します) のセット J を維持します。これは、「接合点」、つまり、2、3、または 4 つの長方形が交わる角を表します。上記の図では、{1,4} は長方形 1 と 4 の (左) 隅を示し、{1,4,8} は長方形 1、4、および 8 の隅を示します。このような n タプルが 25 個あります。 .

長方形 R に対して最も近い長方形クエリを実行する場合、J 内の R のすべての出現箇所を見つける必要があります。これは、「長方形 R は n タプルに現れる」という関係に基づいて、J の要素を等価クラスに編成すると簡単です。矩形番号でベクトルにインデックスを付けます。次に、R の近傍を検索すると O(1) になります。

于 2013-07-02T02:03:35.693 に答える
0

あなたの場合、最も近い長方形のそれぞれは、共通の側面またはその一部を共有する必要があります(長方形9と長方形3の場合のように)

  1. rect に最も近い四角形を見つけたいとします。
  2. コーナーの(x、y)座標を知っています
  3. エッジに沿って座標が異なることがわかっています
  4. たとえば、エッジ A(x3,y3) から A(x4,y4) を考えます。
  5. Bと言う長方形を考えて、次の基準のいずれかを満たすかどうかを確認します。

B(x2,y2) は A(x3,y3) と A(x4,y4)
の間 B(x1,y1) は A(x3,y3) と A(x4,y4)
の間 A(x3,y3) はB(x2,y2) と B(x1,y1)
A(x4,y4) は B(x2,y2) と B(x1,y1)
の間にあります B のコーナーは A のコーナーと一致すると見なされます

コーナー A(x3,y3) と A(x4,y4) によって記述されるエッジは、長方形 A の上エッジであり、この上に長方形 B が存在するかどうかを確認したいので、B によって記述される B のエッジを検討します。 (x1,y1) と B(x2,y2)

上記の基準の一部は、場合によっては重複しています。

コーナーの座標を適切に一致させる残りの辺についても同じことを行います。(たとえば、A(x3,y2) と A(x2,y2) で記述される A のエッジを考慮する場合、B(x1,y1) と B(x4,y4) を考慮する)

すべての長方形を考慮してください。それらを数えて、できあがり!

編集:Aが四角形であることを思い出してください。最も近いメンバーを見つけたい。Bは四角形です。指定された基準を満たしているかどうかを確認しています。

于 2013-07-01T19:40:42.560 に答える
0

長方形の x 座標と y 座標がxleft, xright, ybottom, ytop.
四角形を並べ替え、異なる配列に別々に保持します。

  • ybottomarrayybottom : thenの昇順で四角形を並べ替えxleftます。

  • ytoparrayytop: thenの昇順で並べ替えxleftます。

  • xleftarray: の順に並べ替えxleftますytop

  • xrightarray: の順に並べ替えxrightますytop

次に、各長方形を反復処理します。

ステップ 1: 隣接する長方形の数、つまり現在の長方形ybottomと等しい長方形を見つけytopます。

  • バイナリ検索で、ybottom が現在の四角形ybottomarrayと等しい最初と最後のインデックスを見つけます。ytop範囲が であるとしrange_yます。

  • 現在の四角形よりも小さいrange_y四角形のインデックスのバイナリ検索では、idx1と言います。これにより、現在の長方形の上にある左端の長方形が得られます。xleftxleft

  • 再度、現在の四角形の idx2xleft以下の最大値を持つ四角形をバイナリ検索します。xrightこれにより、現在の長方形の上の右端の長方形が得られます。

したがって、idx1 から idx2 にある四角形はすべて、その上の現在の四角形に隣接しています。そのidx2-idx1+1上に長方形が表示されます。同様に、四辺すべての長方形を見つけます。

ステップ 2: 右側の長方形を見つけます。
ステップ 3: 下部の長方形を見つけます。
ステップ 4: 左側の長方形を見つけます。

また、四角形が 2 回カウントされたり、残りがカウントされないように、コーナー ケースを慎重に処理する必要があります。

複雑

並べ替えの手順は複雑O(nlog n)です。
反復の各ステップでは、range_y を見つけるための 2 つのバイナリ検索と、idx1 と idx2 をそれぞれ見つけるためのバイナリ検索が必要です。したがって、各ステップで 4 つのバイナリ検索が行われ、4 つのステップがあります。したがって、反復ごとに O(logn)の複雑さをもたらす合計 16 のバイナリ検索。

したがって、すべての反復の複雑さは O(n logn) になります。
したがって、このソリューションの全体的な複雑さはO(n logn)です。

于 2013-07-02T16:01:00.540 に答える