¿Por qué mis subdivisiones del triángulo del icosaedro no son equiláteras (PostGIS)?

Nov 24 2020

Estoy creando un poliedro geodésico usando PostGIS. Estoy dividiendo los puntos del icosaedro base (ver Apéndice A) , en el primer nivel de subdivisiones de Clase I.

La puesta en marcha

Para simplificar, tomemos solo el primer triángulo formado por estos puntos:

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));

Lo que crea el triángulo base del icosaedro

Los números de los lados del triángulo corresponden a los números de fila que se muestran en la tabla generada por esta consulta.

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

Los puntos son aproximadamente equidistantes. Hay pequeñas variaciones porque los datos iniciales anteriores parecen haber sido generados asumiendo una esfera, no un esferoide, que st_distance está regresando - use_spheroid falsein st_distanceproducirá distancias mucho más cercanas, pero tenga falseen cuenta que usar en todas las consultas presentadas no cambia el problema descrito a continuación.

Primer nivel de subdivisión Clase 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

Lo anterior genera los puntos medios de cada uno de los pares de puntos del triángulo original.

Y estos tienen las siguientes distancias, generadas por esta consulta

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

El problema

Las distancias de los segmentos 7, 8 y 9 (alrededor de 4000kms) son mucho más largas que las distancias de los segmentos 1-6 (alrededor de 3500kms).

¿Por qué este algoritmo no crea algo más parecido a los triángulos equivalentes? Es mi uso de st_azimuthy st_projectmal? ¿O me perdí algunas matemáticas más básicas sobre proyecciones de puntos en esferas?

Respuestas

3 GevaertJoep Nov 28 2020 at 23:35

Sí, esto se debe a las proyecciones del icosaedro a la esfera en mosaico. Pienso en este proceso como:

Tome un icosaedro normal, todas las esquinas se encuentran en la misma esfera y, por lo tanto, la distancia también es la misma cuando se proyecta sobre una esfera. Sin embargo, si tomamos nuestro icosaedro no proyectado y subdividimos todos los triángulos, los puntos generados no estarán en esa esfera. Cuando estos se muevan hacia afuera, serán más grandes, como los triángulos rojos de esta imagen.

Además, estas construcciones se utilizan en arquitectura. Usando la calculadora de domo geodésico , (imagen de su sitio), encontramos para una longitud de borde B de 3.5, la longitud correspondiente para A es 3.9:

Así que de hecho fueron las matemáticas lo que te perdiste.