Как удалить сектор / срез из двумерного массива (широта, долгота)? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть двумерный массив данных с сеткой (широта, долгота) в массиве.Из одной указанной точки в этом массиве я хочу расширить две линии в разных направлениях, так что область между этими двумя линиями создает сектор круга.Это лучше всего объяснить в приведенной ниже визуализации:

enter image description here

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

Я хочу преобразовать все точки в секторе в значения NaN, чтобы можно было фиксировать индексы красных нулей.(На изображении было проще нарисовать их в виде красных нулей, но предпочтительнее NaN. Это действительно их индекс, который мне нужен.) Входными данными для этого будут массив, центральная точка дуги и углыкаждая линия относительно горизонтали (или вертикали).Линии должны простираться за край (широта, долгота) области, как на диаграмме.

Может кто-нибудь предложить способ, чтобы начать меня, и какие подпрограммы были бы наиболее полезны?По общему признанию, я немного озадачен.

РЕДАКТИРОВАТЬ: У меня также есть соответствующий массив широты сетки и долготы сетки.Целочисленный индекс центральной точки известен (так как я знаю широту / долготу центральной точки).«Углы» и «линии» в этом контексте относятся к буквальному географическому пространству.

1 Ответ

0 голосов
/ 19 декабря 2018

Пусть у вас есть центральные индексы cx, cy

Предварительно рассчитайте значения для начальных и конечных углов сектора:

  S_Cos = Cos(Start)
  S_Sin = Sin(Start)
  E_Cos = Cos(End)
  E_Sin = Sin(End)

И сделайте заливка с нулями, используя границуусловия:

 (x-cx) * S_Sin - (y-cy) * S_Cos >= 0   //point is left to starting ray
 (x-cx) * E_Sin - (y-cy) * E_Cos <= 0   //point is right to ending ray
 x >= minx, y>=miny, x<=maxx, y<=maxy   //coordinate is inside array

Прежний подход:

Для малых углов дуги (<90 градусов): </p>

Выберите направление заполнения - в большинстве случаев горизонтальная линия хорошавыбор, в то время как для некоторых направлений начала / конца вертикальное заполнение более удобно (например, 350 градусов - 10 градусов)

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

Для большей дуги - разделить дугу на несколько меньших по осям OX, OY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...