Какой алгоритм использовать для получения точек закрашенного круга?
int start_X = 30; // center point
int start_Y = 30;
int r = 5;
// current point
int x;
int y;
if(?==true)
{
map2D[x][y] = 1; // for filled circle points
}
Вы получаете уравнение круга:
где & b — координаты центральной точки. Все х & У точек, которые удовлетворяют этому уравнению, являются частью круга. Чтобы увидеть, является ли определенная точка (x1, y1), проверьте,
((x1 - start_X) * (x1 - start_X) + (y1 - start_Y) * (y1 - start_Y)) <= r * r
<Знак = также должен включать точки, которые лежат внутри круга. Вы можете безопасно ограничивать диапазоны точек в интервалах [start_X — r; startX + r] и [start_Y — r; startY + r].
Вы можете искать по квадратной области 2r
на 2r
с центром (start_X
,start_Y
):
std::vector< std::pair<int> > circlePoints;
for(int i = start_X - r; i <= start_X + r; i++)
{
for(int j = start_Y - r; j <= start_Y + r; j++)
{
if((start_X-r)*(start_X-r) + (start_Y-r)*(start_Y-r) <= r*r)
{
circlePoints.push_back(std::pair<int>(i,j));
}
}
}
если вы хотите идти прямо ко всем точкам в круге, не проверяя, это путь.
SatY = CenterY;//StartY + R
for (int i = StartX; i < EndX; i++)
{
int StartY = (int)(SatY - Math.Sqrt(Math.Abs((R + i - StartX) * (R - i + StartX))));
int EndY = (int)(SatY + Math.Sqrt(Math.Abs((R + i - StartX) * (R - i + StartX))));
for (int j = StartY; j < EndY; j++)
{
// Do Job
}
}