Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

72 wiersze
1.7 KiB

  1. import {geoProjectionMutator as projectionMutator} from "d3-geo";
  2. import {acos, asin, atan2, cos, degrees, radians, sin, sqrt} from "./math.js";
  3. function satelliteVerticalRaw(P) {
  4. function forward(lambda, phi) {
  5. var cosPhi = cos(phi),
  6. k = (P - 1) / (P - cosPhi * cos(lambda));
  7. return [
  8. k * cosPhi * sin(lambda),
  9. k * sin(phi)
  10. ];
  11. }
  12. forward.invert = function(x, y) {
  13. var rho2 = x * x + y * y,
  14. rho = sqrt(rho2),
  15. sinc = (P - sqrt(1 - rho2 * (P + 1) / (P - 1))) / ((P - 1) / rho + rho / (P - 1));
  16. return [
  17. atan2(x * sinc, rho * sqrt(1 - sinc * sinc)),
  18. rho ? asin(y * sinc / rho) : 0
  19. ];
  20. };
  21. return forward;
  22. }
  23. export function satelliteRaw(P, omega) {
  24. var vertical = satelliteVerticalRaw(P);
  25. if (!omega) return vertical;
  26. var cosOmega = cos(omega),
  27. sinOmega = sin(omega);
  28. function forward(lambda, phi) {
  29. var coordinates = vertical(lambda, phi),
  30. y = coordinates[1],
  31. A = y * sinOmega / (P - 1) + cosOmega;
  32. return [
  33. coordinates[0] * cosOmega / A,
  34. y / A
  35. ];
  36. }
  37. forward.invert = function(x, y) {
  38. var k = (P - 1) / (P - 1 - y * sinOmega);
  39. return vertical.invert(k * x, k * y * cosOmega);
  40. };
  41. return forward;
  42. }
  43. export default function() {
  44. var distance = 2,
  45. omega = 0,
  46. m = projectionMutator(satelliteRaw),
  47. p = m(distance, omega);
  48. // As a multiple of radius.
  49. p.distance = function(_) {
  50. if (!arguments.length) return distance;
  51. return m(distance = +_, omega);
  52. };
  53. p.tilt = function(_) {
  54. if (!arguments.length) return omega * degrees;
  55. return m(distance, omega = _ * radians);
  56. };
  57. return p
  58. .scale(432.147)
  59. .clipAngle(acos(1 / distance) * degrees - 1e-6);
  60. }