Мне нужно прокрутить массив по кругу в форме дуги с небольшим радиусом (например, нарисовать круговой пиксель на пиксель), но весь алгоритм, который я пытался, проверяет повторяющиеся индексы массива (у него одинаковые x и y несколько раз). У меня есть радиус 3, с круглой формой из 28 элементов (не заполнен), но алгоритм повторяется 360 раз. Я могу проверить, изменились ли x или y, прежде чем я что-то сделаю, но он хромой.Петля через массив в форме круга без повторных индексов
Мой код прямо сейчас:
for (int radius = 1; radius < 6; radius++)
{
for (double i = 0; i < 360; i += 1)
{
double angle = i * System.Math.PI/180;
int x = (int)(radius * System.Math.Cos(angle)) + centerX;
int y = (int)(radius * System.Math.Sin(angle)) + centerY;
// do something
// if (array[x, y]) ....
}
}
PS: Я не могу использовать среднюю точку круга, потому что мне нужно, чтобы увеличить радиус начиная от 2 до 6, а не каждый индекс получается, потому что его окружение это не реально (согласно тригонометрии)
EDIT: Что мне действительно нужно, сканирует весь край круга по краю, начиная с центра.
360 шагов (это получить все координаты):
for (int radius = 2; radius <= 7; radius++)
{
for (double i = 0; i <= 360; i += 1)
{
double angle = i * System.Math.PI/180;
int x = (int)(radius * System.Math.Cos(angle));
int y = (int)(radius * System.Math.Sin(angle));
print(x, y, "X");
}
}
Использование MidPoint круг или другие шаги алгоритма пропуска (недостающие координаты):
for (int radius = 2; radius <= 7; radius++)
{
int x = radius;
int y = 0;
int err = 0;
while (x >= y)
{
print(x, y, "X");
print(y, x, "X");
print(-y, x, "X");
print(-y, x, "X");
print(-x, y, "X");
print(-x, -y, "X");
print(-y, -x, "X");
print(y, -x, "X");
print(x, -y, "X");
y += 1;
err += 1 + 2 * y;
if (2 * (err - x) + 1 > 0)
{
x -= 1;
err += 1 - 2 * x;
}
}
}
Почему вы делаете всю эту тригонометрию? Если вы просто используете алгоритм Брешенема, это будет быстрее и решит вашу проблему (если вы будете осторожны в начале и в конце). [Википедия] (https://en.wikipedia.org/wiki/Midpoint_circle_algorithm) - ваш друг. –
Потому что мне нужно сканировать полный край круга по краю. Алгоритм Брешенема не получает всех координат, оставляя некоторые индексы. – Possoli
Пожалуйста, отредактируйте ваш вопрос, чтобы объяснить, что вы подразумеваете под «всеми координатами».Алгоритм Брешенема останавливается хотя бы один раз для каждого * x * и для каждого * y *. Неясно, какие ценности вы считаете недостающими. –