我有一些代碼來生成網格座標(SDL_Point
只包含兩個int
S代表X和Y)與圓形:中點圓圈沒有重複?
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;
}
這工作不錯,但我注意到,從一個複製時的一些座標添加兩次八分到另一個(在畫面更清晰灰色):
是否存在已知的方式,以避免這些重複的或者我應該將它們添加到vector
之前只檢查?
我想知道最有效的方法是什麼。我還沒有找到任何答案,我猜這通常不是打印普通彩色圓圈時需要考慮的問題。
編輯:我需要向量作爲輸出。
謝謝! :)
它是否有任何*實際*性能或正確性影響?如果不是,那麼忽略它總是一個有效的選擇。 –