2017-05-22 3 views
1

Iは円形で(SDL_Pointは単にxとyのための2つのint複数を含む)のグリッド座標を生成するためにいくつかのコードを持っている:重複のない中間点の円ですか?

std::vector<SDL_Point> circle(const SDL_Point & start, const int radius) 
{ 
    int x{ radius }, y{ 0 }; 
    int xChange{ 1 - 2 * radius }; 
    int yChange{ 1 }; 
    int rError{ 0 }; 

    std::vector<SDL_Point> circle; 
    SDL_Point coord; 

    while (x >= y) 
    { 
     /* Due to circle's symmetry, we need only to calculate 
      points in the first 45º of the circle. 
     */ 

     coord = { start.x + x, start.y + y }; // Octant 1. 
     circle.push_back(coord); 
     coord = { start.x - x, start.y + y }; // Octant 4. 
     circle.push_back(coord); 
     coord = { start.x - x, start.y - y }; // Octant 5. 
     circle.push_back(coord); 
     coord = { start.x + x, start.y - y }; // Octant 8. 
     circle.push_back(coord); 
     coord = { start.x + y, start.y + x }; // Octant 2. 
     circle.push_back(coord); 
     coord = { start.x - y, start.y + x }; // Octant 3. 
     circle.push_back(coord); 
     coord = { start.x - y, start.y - x }; // Octant 6. 
     circle.push_back(coord); 
     coord = { start.x + y, start.y - x }; // Octant 7. 
     circle.push_back(coord); 

     ++y; 
     rError += yChange; 
     yChange += 2; 

     if (2 * rError + xChange > 0) 
     { 
      --x; 
      rError += xChange; 
      xChange += 2; 
     } 
    } 

    return circle; 
} 

これはうまく動作するが、私は1つからコピーする場合、いくつかの座標を二回追加され気づい別の八分儀(写真の明確グレー):

midpoint circle

それらの重複を持つか、私はちょうどvectorに追加する前に確認する必要があります回避するための既知の方法はありますか?

これを行う最も効率的な方法は何ですか?私は答えは見つけられませんでした。普通の色のサークルを印刷するときにはそれが問題ではないと思います。

EDIT:出力としてベクトルが必要です。

ありがとうございます! :)

+0

実際のパフォーマンスや正確性には何らかの影響がありますか?そうでない場合、それを無視することは常に有効なオプションです。 –

答えて

2

yが0の場合(図の端に沿って)、x == y(円の対角線)の場合、重複を生成するケースが2つあります。これらの条件の適切なcoord計算の前にチェックを追加して除外することができます。

たとえば、yがゼロの場合、coord = { start.x + x, start.y + y };coord = { start.x + x, start.y - y };は同じ値を生成します。

+0

ええと、あなたは正しい、多分それは最も簡単な解決策です。ありがとう、私は試してみよう! – JoePerkins

+0

うん、それは働いた:) – JoePerkins

3

あなたは

std::set<SDL_Point> 

のように一意性を強制した容器を使用して、一backの代わりにinsertメソッドを使用することができます。

+0

私はそれについて考えていましたが、それは本当に効率的ですか?私は決してよく分からない。とにかく出力としてベクトルが必要なので、セットの内容をコピーする必要があります。 – JoePerkins

+0

ええ、それは効率的です。少なくともベクター内の一意性を保証するために何をするかと同じくらい効率的です。 –

+0

ベクトルが必要な特別な理由はありますか?多分それはセットでも達成できます。 –

関連する問題