Шестиугольники из треугольников на сфере: построение гексагональной / геодезической сетки из сетки икосаэдра (только Северный полюс) - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь построить гексагональную / геодезическую сетку на сфере. Для моих целей я сосредоточен только на Северном полюсе. До сих пор мне удалось построить треугольную сетку на основе икосаэдра, используя пакет stripy. Пакет stripy позволяет мне уточнить сетку путем деления пополам: каждое ребро делится пополам или, что то же самое, каждый треугольник делится на 4 меньших треугольника.

image image

I want to create an (almost) hexagonal grid by combining 6 triangles (5 at the pole) as follows:

image

У меня естьдоступна следующая информация:

  • широта / долгота всех вершин как np.array
  • триплеты индексов вершин треугольника

Ограничение заключается в том, что индексыскорее "случайные", то есть они не увеличиваются, если идти по спирали или что-то подобное.

Можно найти середины каждого шестиугольника (/ пятиугольника) и сгруппировать все треугольники, которыеиметь эту среднюю точку в качестве одной из своих трех вершин, но я не уверен, как алгоритмически сделать это. Каков будет эффективный способ найти вершины, обозначающие середины каждого шестиугольника? Может ли это быть каким-то образом связано с более грубой версией сетки (т.е. до деления пополам)?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

В качестве альтернативы можно построить диаграмму Вороного триангуляции;например, используя scipy.spatial.SphericalVoronoi(). Диаграмма Вороного икосаэдрической сетки дает геодезическую (гексагональную) сетку. Смотрите, например, Wang et al. (2011).

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

Для диаграммы Вороного это намного проще, так как по определению содержащий шестиугольник соответствует шестиугольнику, сгенерированному ближайшей вершиной в исходной триангуляции.

Ван, Нин иДжин-Луен Ли. «Геометрические свойства икосаэдрально-гексагональной сетки на двух сферах». Журнал SIAM по научным вычислениям 33,5 (2011): 2536-2559.

0 голосов
/ 03 октября 2019

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

  1. Пусть V0 будет набором, содержащимвсе вершины и E0 - множество, содержащее все ребра. Пусть V1 будет пустым множеством, которое мы будем использовать для хранения новых вершин шестиугольника-середины для каждого прохода. Пусть V2 будет пустым набором, который будет содержать окончательный набор середин шестиугольника. Пусть E1 будет набором ребер, которые образуют «переднюю линию» идентифицированных шестиугольников, и пусть E2 будет пустым набором, который будет содержать окончательный набор ребер шестиугольника.
  2. Определите вершину на Северном полюсе. Переместите его из V0 в V1
  3. Найдите все ребра, противоположные этой вершине. Переместите эти края в E1.
  4. Из E0 удалите ребра, которые связаны с вершиной (более поздние вершины) в V1.
  5. Из V0 удалите вершины, которые связаны ребрами в E1.
  6. Переместитьвсе вершины от V1 до V2.
  7. Каждое ребро в E1 является частью другого треугольника, для которого оно образует ребро, противоположное вершине, являющейся центром шестиугольника. Определите вершины, которые противоположны ребрам в E1. Переместите их в V1.
  8. Переместить ребра из E1 в E2.
  9. В E0 все ребра, противоположные вершинам в V1. Переместите их в E1.
  10. Из E0 удалите ребра, которые связаны с вершинами в V1.
  11. Из V0 удалите вершины, которые связаны ребрами в E1.
  12. Переместите все вершины V1 в V2.

и т. Д. и т. д.

...