Pourquoi mes subdivisions de triangle d'icosaèdre ne sont-elles pas équilatérales (PostGIS)?

Nov 24 2020

Je crée un polyèdre géodésique à l' aide de PostGIS. Je divise les points de l'icosaèdre de base (voir l'annexe A) , dans le premier niveau des subdivisions de classe I.

La mise en place

Pour simplifier, prenons juste le premier triangle formé par ces points:

CREATE TABLE pix (
    id bigserial
  , name text
  , geog geography(POINT,4326) -- use WGS84
);

insert into pix values (DEFAULT, 'China', st_point(122.3, 39.1));
insert into pix values (DEFAULT, 'Norway', st_point(10.53619898, 64.7));
insert into pix values (DEFAULT, 'Arabian sea', st_point(58.15770555, 10.44734504));

Ce qui crée le triangle de l'icosaèdre de base

Les numéros des côtés du triangle correspondent aux numéros de ligne indiqués dans le tableau généré par cette requête

select p1.name
  , p2.name
  , st_distance(p1.geog, p2.geog) as dist
from pix p1
  cross join pix p2
where p1.id < p2.id

Les points sont à peu près équidistants. Il y a de petites variances parce que les données de départ ci-dessus semblent avoir été générées en supposant une sphère, et non un sphéroïde, que st_distance renvoie - use_spheroid falsein st_distanceproduira des distances beaucoup plus proches, mais notez que l'utilisation falsedans toutes les requêtes présentées ne change pas le problème décrit ci-dessous.

Premier niveau de subdivision de classe I

insert into pix (name, geog)
select p1.name || '-' || p2.name
  , st_project(p1.geog, st_distance(p1.geog, p2.geog) / 2, st_azimuth(p1.geog, p2.geog)) as geog
from pix p1
  cross join pix p2
where p1.id < p2.id

Ce qui précède génère les points médians de chacune des paires de points sur le triangle d'origine

Et ceux-ci ont les distances suivantes, générées par cette requête

select p1.name
  , p2.name
  , st_distance(p1.geog, p2.geog) as dist
from pix p1
  cross join pix p2
where p1.id < p2.id
  and p2.id > 3
order by dist

Le problème

Les distances des segments 7, 8 et 9 (environ 4000kms) sont beaucoup plus longues que les distances des segments 1-6 (environ 3500kms).

Pourquoi cet algorithme ne crée-t-il pas quelque chose de plus proche des triangles équilatéraux? Mon utilisation est- st_azimuthelle st_projecterronée? Ou ai-je manqué des mathématiques plus élémentaires sur les projections de points sur des sphères?

Réponses

3 GevaertJoep Nov 28 2020 at 23:35

Oui, cela est dû aux projections de l'icosaèdre en mosaïque vers la sphère. Je considère ce processus comme:

Prenez un icosaèdre normal, tous les coins se trouvent sur la même sphère et, par conséquent, la distance est également la même lorsqu'elle est projetée sur une sphère. Cependant, si nous prenons notre icosaèdre non projeté et subdivisons tous les triangles, les points générés ne seront pas sur cette sphère. Lorsque ceux-ci se déplacent vers l'extérieur, ils seront plus gros, comme les triangles rouges de cette image.

En outre, ces constructions sont utilisées en architecture. En utilisant le calculateur de dôme géodésique , (image de leur site), nous trouvons pour une longueur d'arête B de 3,5, la longueur correspondante pour A est de 3,9:

Donc, en effet, ce sont les mathématiques qui vous ont manqué.