Une extension de GeoJSON à la 3D et aux dimensions supérieures.
Installation
pnpm add -D @types/hyper-geojson@github:kamataryo/types__hyper-geojson#main
Utilisation
cube.ts
import type { Polyhedron } from 'hyper-geojson'
// A unit cube: six square faces, each turned to face outward
export const cube: Polyhedron = {
type: 'Polyhedron',
coordinates: [
[[[0, 0, 0], [0, 0, 1], [0, 1, 1], [0, 1, 0], [0, 0, 0]]],
[[[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1], [0, 0, 0]]],
[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0], [0, 0, 0]]],
[[[1, 1, 1], [1, 0, 1], [1, 0, 0], [1, 1, 0], [1, 1, 1]]],
[[[1, 1, 1], [1, 1, 0], [0, 1, 0], [0, 1, 1], [1, 1, 1]]],
[[[1, 1, 1], [0, 1, 1], [0, 0, 1], [1, 0, 1], [1, 1, 1]]],
],
}corners.ts
import type { HyperFeature, HyperPosition, Polychoron } from 'hyper-geojson'
// Every corner of a polychoron: cells, then faces, then rings, then positions
export function corners(feature: HyperFeature<Polychoron>): HyperPosition[] {
return feature.geometry.coordinates.flat(3)
}depth.ts
import type { Polytope } from 'hyper-geojson'
// A 5-polytope nests its positions five levels deep
export const fine: Polytope<5> = {
type: 'Polytope5',
coordinates: [[[[[[0, 0, 0, 0, 0]]]]]],
}
export const tooShallow: Polytope<5> = {
type: 'Polytope5',
// @ts-expect-error four levels are one too few
coordinates: [[[[[0, 0, 0, 0, 0]]]]],
}Visionneuse
Exemple
cells
Éditeur en direct
Règle d’orientation
Chaque bord est tourné à l’opposé de ce qu’il borde. C’est la règle de la main droite de GeoJSON, étendue à toutes les dimensions :
- L’anneau extérieur d’un polygone tourne dans le sens inverse des aiguilles d’une montre, et ses trous dans le sens des aiguilles d’une montre.
- Les faces d’un polyèdre, selon la règle de la main droite, tournent leurs normales à l’opposé du solide, donc vers l’intérieur de tout vide qu’il contient.
- Les cellules d’un polychore sont tournées vers l’extérieur de la même façon.
Ainsi, les deux voisins de chaque bord commun le parcourent en sens opposés : chaque arête d’un polyèdre par deux faces, chaque face d’un polychore par deux cellules. Le nombre d’enroulement d’un point vaut alors 1 à l’intérieur du solide, et 0 à l’extérieur ou dans un vide.
Un vide n’a pas besoin de son propre niveau d’imbrication : c’est un bord tourné dans l’autre sens. Les types ne vérifient que la profondeur d’imbrication : un bord vrillé ou ouvert passe donc la vérification, comme un anneau ouvert en GeoJSON.