0

設定されたステップサイズでグリッド要素を反復処理できるようにしたいと思います。この問題の楽しい部分は、グリッドが回転することです。私はこれを行うためのアルゴリズムを開発しましたが、場合によっては成功します。次の画像は問題を示しています。

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

問題の条件は、グリッドの長さと幅の要素であるグリッド間隔が提供されることです(補足として、グリッドは長方形にすることができます)。アルゴリズムはグリッドを反復処理し、グリッドがどこにあるかを出力する必要があります。以下にいくつかのコードとその動作例を示します。

int main() {
vector< vector<double> > bound;
vector<double> point;
point.push_back(0);
point.push_back(4);

bound.push_back(point);
point[0] = 6; point[1] = 10;
bound.push_back(point);
point[0] = 4; point[1] = 0;
bound.push_back(point);
point[0] = 10; point[1] = 6;
bound.push_back(point);

double d = 0.5;
double x, y;
int countx = 0, county = 0;
for (double i = bound[0][0]; i < bound[2][0]; i+=d) {
    //std::cout << "I: " << i << std::endl;
    for (double j = bound[0][1]; j < bound[1][1]; j+=d) {
        //std::cout << "J: " << j << std::endl;
        x = i+d+(double)county*d;
        y = j-(double)countx*d;
        ++county;
        std::cout << "i, j, x and y: " << i << "\t" << j << "\t" << x << "\t" << y << std::endl;
    }
    std::cout << "new Row--------------------\n";
    ++countx;
    county = 0;
}   
}

上記のコードは機能し、グリッド要素を正しく出力します。

x and y: 4, 0.5
x and y: 4.5, 1
etc.

ただし、境界のある長方形を試す場合:

[(0.5, 6), (3, 8.5), (5.5, 1), (8, 3.5)]

ステップサイズ(d)は1

長方形の境界の外側まで繰り返します。これが発生している理由がわかります。余分な+dがあるため、forループのイテレータ条件には含まれていません。

私の質問は、この問題に取り組むためのより良い方法はありますか、そして私はそれをどのように解決しますか?

これが以前に実装されていて、ソースコードがあるかどうか誰かが知っていますか?

助けてくれてありがとう。

ベン

4

1 に答える 1

0

私がやったのは、2つの辺のピタゴラスの法則によって長方形の長さと幅を計算することでした。次に、原点で下隅に位置合わせされた仮想長方形上にグリッドを作成しました。次に、行列の回転と平行移動用に事前に開発されたライブラリを使用して、左下隅への変位によってポイントを平行移動し、計算された長方形の角度に回転させることで、ポイントを個別に変換しました。

これは上記のソリューションに似ていますが、完全な変換行列を使用します。答えはもっと簡単になってしまったので、そうなると思いました。

助けてくれてありがとう。

于 2012-05-01T05:07:12.830 に答える