2012-04-30 11 views
0

グリッド要素をステップサイズで繰り返し処理したいと考えています。この問題の楽しい部分は、グリッドが回転することです。私はこれを行うためのアルゴリズムを開発しており、いくつかのケースでは成功しています。下の画像は、問題を特定する:回転したグリッドを反復する方法

enter image description here

問題の条件は、グリッド間隔が(サイドノートとしてグリッドは、矩形であってもよい)、グリッドの長さと幅の因子であるが提供されることです。アルゴリズムは、グリッドを反復して、それがどこにあるかを印刷する必要があります。ここではいくつかのコードと作業それの例は次のとおりです。

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; 
} 
} 

作品と正しく印刷グリッド要素、すなわち上記のコード:

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

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

しかし境界を持つ矩形をしようとしたとき

とステップサイズ(d)が1である。

矩形境界の外側に反復する。なぜこれが起こっているのか分かりますが、forループのイテレーターの条件には、余分な+ dが含まれているため、それが含まれません。

私の質問は、この問題にアプローチするには良い方法がありますか?

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

助けをお祈りします。私はそれについて行くことになった

ベン

+0

グリッド上のすべての点は整数値か、ここでは「double」値を使用する必要がありますか?これを回転と変形された整数値のx-yグリッドとしてモデル化すると考えましたか?グリッドが入っている変換を表すために行列を使うことができます。次に、その値を出力する前に2次元ベクトルを変換行列に押し込む計算を行います。 – Will

+0

こんにちは、アドバイスをいただき、ありがとうございます。また、この質問は本当に投票の価値がないのでしょうか?私はそれをかなり詳細にして合理的に興味深い質問を提供したと思った? –

答えて

0

ウェイは、両側の2つのオンピタゴラスルールによって長方形の長さと幅を計算しました。私はその後、原点の下隅に揃えられた仮想矩形上にグリッドを作成しました。次に、マトリックス回転と平行移動にあらかじめ開発されたライブラリを使用して、点を左下隅に移動し、それらを矩形の計算された角度に回転することによって点を個別に変換しました。

これは上記の解決策に似ていますが、完全な変換マトリックスを使用しています。答えはより単純になり、私はそれがそうであると思った。

ありがとうございました。

関連する問題