1 | import {geoCentroid as centroid, geoProjection as projection} from "d3-geo";
|
2 | import {collignonRaw} from "../collignon.js";
|
3 | import {pi, sqrt} from "../math.js";
|
4 | import polyhedral from "./index.js";
|
5 | import octahedron from "./octahedron.js";
|
6 |
|
7 | var kx = 2 / sqrt(3);
|
8 |
|
9 | function collignonK(a, b) {
|
10 | var p = collignonRaw(a, b);
|
11 | return [p[0] * kx, p[1]];
|
12 | }
|
13 |
|
14 | collignonK.invert = function(x,y) {
|
15 | return collignonRaw.invert(x / kx, y);
|
16 | };
|
17 |
|
18 | export default function(faceProjection) {
|
19 |
|
20 | faceProjection = faceProjection || function(face) {
|
21 | var c = centroid({type: "MultiPoint", coordinates: face});
|
22 | return projection(collignonK).translate([0, 0]).scale(1).rotate(c[1] > 0 ? [-c[0], 0] : [180 - c[0], 180]);
|
23 | };
|
24 |
|
25 | var faces = octahedron.map(function(face) {
|
26 | return {face: face, project: faceProjection(face)};
|
27 | });
|
28 |
|
29 | [-1, 0, 0, 1, 0, 1, 4, 5].forEach(function(d, i) {
|
30 | var node = faces[d];
|
31 | node && (node.children || (node.children = [])).push(faces[i]);
|
32 | });
|
33 |
|
34 | return polyhedral(faces[0], function(lambda, phi) {
|
35 | return faces[lambda < -pi / 2 ? phi < 0 ? 6 : 4
|
36 | : lambda < 0 ? phi < 0 ? 2 : 0
|
37 | : lambda < pi / 2 ? phi < 0 ? 3 : 1
|
38 | : phi < 0 ? 7 : 5];
|
39 | })
|
40 | .angle(-30)
|
41 | .scale(121.906)
|
42 | .center([0, 48.5904]);
|
43 | }
|