Заполненный круг в матрице (2D массив)

Какой алгоритм использовать для получения точек закрашенного круга?

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
}

2

Решение

Вы получаете уравнение круга:

где & 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].

7

Другие решения

Вы можете искать по квадратной области 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));
}
}
}
2

если вы хотите идти прямо ко всем точкам в круге, не проверяя, это путь.

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
}
}
1
По вопросам рекламы [email protected]