Легко. Возьми угол (скажем, 45). Это соответствует вектору v=(1, 1)
в вашем случае. (Это может быть нормализовано к унитарному вектору (sqrt(2)/2, sqrt(2)/2)
, но это не обязательно)
Для каждой отдельной точки в вашем массиве у вас есть их координаты (x, y)
. Просто сделайте скалярное произведение этих координат на вектор. Давайте назовем f(x, y) = scalarProduct((x, y), v)
Сортируйте значения f(x, y)
, и вы получите "обход", который вы ищете!
Реальный пример.
Ваша матрица 3х3
Скалярные продукты:
(0,0). (1,1) = 0
(0,1). (1,1) = 1
(0,2). (1,1) = 2
(1,0). (1,1) = 1
(1,1). (1,1) = 2
(1,2). (1,1) = 3
(2,0). (1,1) = 2
(2,1). (1,1) = 3
(2,2). (1,1) = 4
Если вы заказываете эти скалярные произведения в порядке возрастания, вы получаете порядок (0,0), (1,0), (1,0), (2,0), (1,1), (0, 2), (2,1) ...
А если вы хотите сделать это с углом 20, замените все вхождения v=(1, 1)
на v=(cos(20), sin(20))
Вот иллюстрация геометрической интерпретации. Скалярные произведения соответствуют пересечению вектора v (красным) с синими линиями.