Как вы перебираете круг значений в 2d массиве? - PullRequest
3 голосов
/ 04 января 2011

Зацикливание квадратного сечения 2-мерного массива легко, но как выполнить циклическое сечение?

Ответы [ 3 ]

8 голосов
/ 04 января 2011

Я сделал это, выполнив двойной цикл for, как если бы вы обычно проходили через 2d массив. Однако внутри этого цикла проверьте, находится ли рассматриваемый элемент массива в окружности радиуса r, используя формулу расстояния.

Например, для массива 10x10 и выбранного «центра» массива в точке (x, y):

for i from 0 to 9 {
    for j from 0 to 9 {
        a = i - x
        b = j - y
        if a*a + b*b <= r*r {
            // Do something here
        }
    }
}

(Код - просто псевдокод, а не какой-либо конкретный язык).

3 голосов
/ 05 января 2011

Вы можете сделать намного лучше, чем использовать тригонометрические функции (которые стоят дорого) или использовать уравнение окружности, что в конечном итоге потребует принятия дорогого квадратного корня.

Здесь есть страница, посвященная этой теме:

http://www.cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html

По сути, ответ заключается в том, что вы хотите выяснить, какие начальные и конечные точки круга находятся в каждой строке вашего массива. Для этого вычисляют «смещение» от предыдущей строки, то есть «отличие» от начальной точки предыдущей строки (и аналогично для конечной точки).

Эта разница может быть вычислена математически с использованием производной. Уточнение заключается в том, чтобы вычислять разницу между последовательными различиями с использованием двойной производной.

Во всяком случае, эта абстрактная математическая идея приводит к алгоритму окружности средней точки, который иногда называют алгоритмом окружности Брезенехана. См. Википедию для более подробной информации о самом алгоритме:

http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

1 голос
/ 04 января 2011

Полагаю, вы имеете в виду нечто подобное

[ ][ ][x][0][ ][ ]
[ ][x][ ][ ][1][ ]
[9][ ][ ][ ][ ][2]
[8][ ][ ][ ][ ][3]
[ ][7][ ][ ][4][ ]
[ ][ ][6][5][ ][ ]

если это так, возможно, вам придется использовать некоторую базовую тригонометрию. Я бы использовал триггер для увеличения угла до тех пор, пока вы не получите следующее значение и не добавите их в другой массив (или не добавите координаты [i, j] к новому массиву), потому что шаги в углах не будут соответствовать четным шагам.

...