Skip to content

Instantly share code, notes, and snippets.

@wboykinm
Forked from mbostock/.block
Created July 5, 2016 17:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wboykinm/c7c21293250b08c079d512d81be427f7 to your computer and use it in GitHub Desktop.
Save wboykinm/c7c21293250b08c079d512d81be427f7 to your computer and use it in GitHub Desktop.
Adams
license: gpl-3.0
height: 960
border: no

The Adams hemisphere-in-a-square is a transverse version of the Peirce quincuncial projection, which is available in d3-geo-projection.

// https://d3js.org/d3-geo-projection/ Version 1.0.0. Copyright 2016 Mike Bostock.
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("d3-geo")):"function"==typeof define&&define.amd?define(["exports","d3-geo"],r):r(n.d3=n.d3||{},n.d3)}(this,function(n,r){"use strict";function t(n){return n?n/Math.sin(n):1}function e(n){return n>1?gr:n<-1?-gr:Math.asin(n)}function o(n){return n>1?0:n<-1?vr:Math.acos(n)}function i(n){return n>0?Math.sqrt(n):0}function u(n){return n=Zn(2*n),(n-1)/(n+1)}function a(n){return(Zn(n)-Zn(-n))/2}function c(n){return(Zn(n)+Zn(-n))/2}function f(n){return nr(n+i(n*n+1))}function v(n){return nr(n+i(n*n-1))}function g(n){function r(n,r){var t=Yn(n),e=Yn(r),i=ur(r),u=e*t,a=-((1-u?nr((1+u)/2)/(1-u):-.5)+o/(1+u));return[a*e*ur(n),a*i]}var t=ar(n/2),o=2*nr(Yn(n/2))/(t*t);return r.invert=function(r,t){var u,a=i(r*r+t*t),c=-n/2,f=50;if(!a)return[0,0];do{var v=c/2,g=Yn(v),l=ur(v),s=ar(v),h=nr(1/g);c-=u=(2/s*h-o*s-a)/(-h/(l*l)+1-o/(2*g*g))}while(Un(u)>cr&&--f>0);var p=ur(c);return[Xn(r*p,a*Yn(c)),e(t*p/a)]},r}function l(){var n=gr,t=r.geoProjectionMutator(g),e=t(n);return e.radius=function(r){return arguments.length?t(n=r*wr):n*dr},e.scale(173).clipAngle(148)}function s(n,r){var e=Yn(r),i=t(o(e*Yn(n/=2)));return[2*e*ur(n)*i,ur(r)*i]}function h(){return r.geoProjection(s)}function p(n){function r(n,r){var a=Yn(r),c=Yn(n/=2);return[(1+a)*ur(n),(o*r>-Xn(c,i)-.001?0:10*-o)+u+ur(r)*e-(1+a)*t*c]}var t=ur(n),e=Yn(n),o=n>=0?1:-1,i=ar(o*n),u=(1+t-e)/2;return r.invert=function(n,r){var a=0,c=0,f=50;do{var v=Yn(a),g=ur(a),l=Yn(c),s=ur(c),h=1+l,p=h*g-n,d=u+s*e-h*t*v-r,w=h*v/2,R=-g*s,P=t*h*g/2,j=e*l+t*v*s,y=R*P-j*w,E=(d*R-p*j)/y/2,M=(p*P-d*w)/y;a-=E,c-=M}while((Un(E)>cr||Un(M)>cr)&&--f>0);return o*c>-Xn(Yn(a),i)-.001?[2*a,c]:null},r}function d(){var n=20*wr,t=n>=0?1:-1,e=ar(t*n),o=r.geoProjectionMutator(p),i=o(n),u=i.stream;return i.parallel=function(r){return arguments.length?(e=ar((t=(n=r*wr)>=0?1:-1)*n),o(n)):n*dr},i.stream=function(r){var o=i.rotate(),a=u(r),c=(i.rotate([0,0]),u(r));return i.rotate(o),a.sphere=function(){c.polygonStart(),c.lineStart();for(var r=t*-180;t*r<180;r+=90*t)c.point(r,90*t);for(;t*(r-=n)>=-180;)c.point(r,t*-Xn(Yn(r*wr/2),e)*dr);c.lineEnd(),c.polygonEnd()},a},i.scale(210).translate([480,353])}function w(n,r){var t=ar(r/2),e=i(1-t*t),o=1+e*Yn(n/=2),u=ur(n)*e/o,a=t/o,c=u*u,f=a*a;return[4/3*u*(3+c-3*f),4/3*a*(3+3*c-f)]}function R(){return r.geoProjection(w).scale(63)}function P(n,r){var t=Un(r);return t<lr?[n,nr(ar(lr+r/2))]:[n*Yn(t)*(2*hr-1/ur(t)),ir(r)*(2*hr*(t-lr)-nr(ar(t/2)))]}function j(){return r.geoProjection(P).scale(110)}function y(n){function t(n,t){var o=r.geoAzimuthalEquidistantRaw(n,t);if(Un(n)>gr){var a=Xn(o[1],o[0]),c=i(o[0]*o[0]+o[1]*o[1]),f=u*or((a-gr)/u)+gr,v=Xn(ur(a-=f),2-Yn(a));a=f+e(vr/c*ur(v))-v,o[0]=c*Yn(a),o[1]=c*ur(a)}return o}var u=2*vr/n;return t.invert=function(n,t){var e=i(n*n+t*t);if(e>gr){var a=Xn(t,n),c=u*or((a-gr)/u)+gr,f=a>c?-1:1,v=e*Yn(c-a),g=1/ar(f*o((v-vr)/i(vr*(vr-2*v)+e*e)));a=c+2*Vn((g+f*i(g*g-3))/3),n=e*Yn(a),t=e*ur(a)}return r.geoAzimuthalEquidistantRaw.invert(n,t)},t}function E(){var n=5,t=r.geoProjectionMutator(y),o=t(n),i=o.stream,u=.01,a=-Yn(u*wr),c=ur(u*wr);return o.lobes=function(r){return arguments.length?t(n=+r):n},o.stream=function(r){var t=o.rotate(),f=i(r),v=(o.rotate([0,0]),i(r));return o.rotate(t),f.sphere=function(){v.polygonStart(),v.lineStart();for(var r=0,t=360/n,o=2*vr/n,i=90-180/n,f=gr;r<n;++r,i-=t,f-=o)v.point(Xn(c*Yn(f),a)*dr,e(c*ur(f))*dr),i<-90?(v.point(-90,-180-i-u),v.point(-90,-180-i+u)):(v.point(90,i+u),v.point(90,i-u));v.lineEnd(),v.polygonEnd()},f},o.scale(85).clipAngle(179.999).translate([480,275])}function M(n,r){var t,e=n*ur(r),o=30;do r-=t=(r+ur(r)-e)/(1+Yn(r));while(Un(t)>cr&&--o>0);return r/2}function m(n,r,t){function o(e,o){return[n*e*Yn(o=M(t,o)),r*ur(o)]}return o.invert=function(o,i){return i=e(i/r),[o/(n*Yn(i)),e((2*i+ur(2*i))/t)]},o}function b(){return r.geoProjection(jr).scale(165)}function A(n,r){var t=M(vr,r);return[yr*n/(1/Yn(r)+Er/Yn(t)),(r+hr*ur(t))/yr]}function k(){return r.geoProjection(A)}function G(n){var t=0,e=r.geoProjectionMutator(n),o=e(t);return o.parallel=function(n){return arguments.length?e(t=n*wr):t*dr},o}function S(n,r){return[n*Yn(r),r]}function z(){return r.geoProjection(S)}function C(n){function r(r,e){var o=t+n-e,i=o?r*Yn(e)/o:o;return[o*ur(i),t-o*Yn(i)]}if(!n)return S;var t=1/ar(n);return r.invert=function(r,e){var o=i(r*r+(e=t-e)*e),u=t+n-o;return[o/Yn(u)*Xn(r,e),u]},r}function B(){return G(C).scale(120).translate([450,305]).parallel(45)}function q(n){function r(r,t){var e=gr-t,o=e?r*n*ur(e)/e:e;return[e*ur(o)/n,gr-e*Yn(o)]}return r.invert=function(r,t){var e=r*n,o=gr-t,u=i(e*e+o*o),a=Xn(e,o);return[(u?u/ur(u):1)*a/n,gr-u]},r}function x(){var n=.5,t=r.geoProjectionMutator(q),e=t(n);return e.fraction=function(r){return arguments.length?t(n=+r):n},e}function F(){return r.geoProjection(Mr)}function Q(n,r,t,u,a,c){var f,v=Yn(c);if(Un(n)>1||Un(c)>1)f=o(t*a+r*u*v);else{var g=ur(n/2),l=ur(c/2);f=2*e(i(g*g+r*u*l*l))}return Un(f)>cr?[f,Xn(u*ur(c),r*a-t*u*v)]:[0,0]}function _(n,r,t){return o((n*n+r*r-t*t)/(2*n*r))}function O(n){return n-2*vr*$n((n+vr)/(2*vr))}function W(n,r,t,e,o,i){function u(n,r){var t,e=ur(r),o=Yn(r),i=new Array(3);for(t=0;t<3;++t){var u=c[t];if(i[t]=Q(r-u[1],u[3],u[2],o,e,n-u[0]),!i[t][0])return u.point;i[t][1]=O(i[t][1]-u.v[1])}var a=h.slice();for(t=0;t<3;++t){var f=2==t?0:t+1,v=_(c[t].v[0],i[t][0],i[f][0]);i[t][1]<0&&(v=-v),t?1==t?(v=l-v,a[0]-=i[t][0]*Yn(v),a[1]-=i[t][0]*ur(v)):(v=s-v,a[0]+=i[t][0]*Yn(v),a[1]+=i[t][0]*ur(v)):(a[0]+=i[t][0]*Yn(v),a[1]-=i[t][0]*ur(v))}return a[0]/=3,a[1]/=3,a}for(var a,c=[[n,r,ur(r),Yn(r)],[t,e,ur(e),Yn(e)],[o,i,ur(i),Yn(i)]],f=c[2],v=0;v<3;++v,f=a)a=c[v],f.v=Q(a[1]-f[1],f[3],f[2],a[3],a[2],a[0]-f[0]),f.point=[0,0];var g=_(c[0].v[0],c[2].v[0],c[1].v[0]),l=_(c[0].v[0],c[1].v[0],c[2].v[0]),s=vr-g;c[2].point[1]=0,c[0].point[0]=-(c[1].point[0]=c[0].v[0]/2);var h=[c[2].point[0]=c[0].point[0]+c[2].v[0]*Yn(g),2*(c[0].point[1]=c[1].point[1]=c[2].v[0]*ur(g))];return u}function I(){var n,t,e,o,i,u,a=r.geoProjectionMutator(W),c=a(),f=r.geoRotation(0,0),v=c.rotate,g=c.center;return delete c.rotate,delete c.center,c.points=function(c){if(!arguments.length)return[[n,t],[e,o],[i,u]];var l=[n=+c[0][0],t=+c[0][1]],s=[e=+c[1][0],o=+c[1][1]],h=[i=+c[2][0],u=+c[2][1]],p=r.geoCentroid({type:"MultiPoint",coordinates:[l,s,h]}),d=f.invert(g());return v(f=[-p[0],-p[1]]),f=r.geoRotation(f),l=f(l),s=f(s),h=f(h),g(f(d)),a(l[0]*wr,l[1]*wr,s[0]*wr,s[1]*wr,h[0]*wr,h[1]*wr)},c.center=function(n){return arguments.length?g(f(n)):f.invert(g())},c.points([[0,22],[45,22],[22.5,-22]]).center([22.5,0]).scale(450).clipAngle(90)}function T(n,r){var t=i(1-ur(r));return[2/pr*n*t,pr*(1-t)]}function D(){return r.geoProjection(T).scale(92)}function H(n){function r(n,r){return[n,(n?n/ur(n):1)*(ur(r)*Yn(n)-t*Yn(r))]}var t=ar(n);return r.invert=t?function(n,r){n&&(r*=ur(n)/n);var e=Yn(n);return[n,2*Xn(i(e*e+t*t-r*r)-e,t-r)]}:function(n,r){return[n,e(n?r*ar(n)/n:r)]},r}function J(){return G(H).scale(240).clipAngle(90)}function K(n,r){return[mr*n*(2*Yn(2*r/3)-1)/pr,mr*pr*ur(r/3)]}function L(){return r.geoProjection(K)}function N(n){function r(n,r){return[n*t,ur(r)/t]}var t=Yn(n);return r.invert=function(n,r){return[n/t,e(r*t)]},r}function U(){return G(N).parallel(38.58).scale(196)}function V(n){function r(n,r){return[n*t,(1+t)*ar(r/2)]}var t=Yn(n);return r.invert=function(n,r){return[n/t,2*Vn(r/(1+t))]},r}function X(){return G(V).scale(120)}function Y(n,r){var t=i(8/(3*vr));return[t*n*(1-Un(r)/vr),t*r]}function Z(){return r.geoProjection(Y).scale(160)}function $(n,r){var t=i(4-3*ur(Un(r)));return[2/i(6*vr)*n*t,ir(r)*i(2*vr/3)*(2-t)]}function nn(){return r.geoProjection($).scale(160)}function rn(n,r){var t=i(vr*(4+vr));return[2/t*n*(1+i(1-4*r*r/(vr*vr))),4/t*r]}function tn(){return r.geoProjection(rn).scale(175)}function en(n,r){var t=(2+gr)*ur(r);r/=2;for(var e=0,o=1/0;e<10&&Un(o)>cr;e++){var u=Yn(r);r-=o=(r+ur(r)*(u+2)-t)/(2*u*(1+u))}return[2/i(vr*(4+vr))*n*(1+Yn(r)),2*i(vr/(4+vr))*ur(r)]}function on(){return r.geoProjection(en).scale(175)}function un(n,r){return[n*(1+Yn(r))/i(2+vr),2*r/i(2+vr)]}function an(){return r.geoProjection(un).scale(168)}function cn(n,r){for(var t=(1+gr)*ur(r),e=0,o=1/0;e<10&&Un(o)>cr;e++)r-=o=(r+ur(r)-t)/(1+Yn(r));return t=i(2+vr),[n*(1+Yn(r))/t,2*r/t]}function fn(){return r.geoProjection(cn).scale(168)}function vn(n,r){var t=ur(n/=2),e=Yn(n),o=i(Yn(r)),u=Yn(r/=2),a=ur(r)/(u+hr*e*o),c=i(2/(1+a*a)),f=i((hr*u+(e+t)*o)/(hr*u+(e-t)*o));return[br*(c*(f-1/f)-2*nr(f)),br*(c*a*(f+1/f)-2*Vn(a))]}function gn(){return r.geoProjection(vn).scale(60)}function ln(n,r){var t=ar(r/2);return[n*Ar*i(1-t*t),(1+Ar)*t]}function sn(){return r.geoProjection(ln).scale(130)}function hn(n,r){var t=r/2,e=Yn(t);return[2*n/pr*Yn(r)*e*e,pr*ar(t)]}function pn(){return r.geoProjection(hn).scale(130)}function dn(n){return[n[0]/2,e(ar(n[1]/2*wr))*dr]}function wn(n){return[2*n[0],2*Vn(ur(n[1]*wr))*dr]}function Rn(n){function t(n){return i(dn(n))}function o(n){t[n]=function(r){return arguments.length?(i[n](r),t):i[n]()}}null==n&&(n=r.geoOrthographic);var i=n(),u=r.geoEquirectangular().scale(dr).precision(0).clipAngle(null).translate([0,0]);return i.invert&&(t.invert=function(n){return wn(i.invert(n))}),t.stream=function(n){var r=i.stream(n),t=u.stream({point:function(n,t){r.point(n/2,e(ar(-t/2*wr))*dr)},lineStart:function(){r.lineStart()},lineEnd:function(){r.lineEnd()},polygonStart:function(){r.polygonStart()},polygonEnd:function(){r.polygonEnd()}});return t.sphere=r.sphere,t},t.rotate=function(n){return arguments.length?(u.rotate(n),t):u.rotate()},t.center=function(n){return arguments.length?(i.center(dn(n)),t):wn(i.center())},o("clipAngle"),o("clipExtent"),o("scale"),o("translate"),o("precision"),t}function Pn(n,t){function e(t,e){var a=r.geoAzimuthalEquidistantRaw(t,e),c=a[0],f=a[1],v=c*c+f*f;if(v>u){var g=i(v),l=Xn(f,c),s=o*or(l/o),h=l-s,p=n*Yn(h),d=(n*ur(h)-h*ur(p))/(gr-p),w=jn(h,d),R=(vr-n)/yn(w,p,vr);c=g;var P,j=50;do c-=P=(n+yn(w,p,c)*R-g)/(w(c)*R);while(Un(P)>cr&&--j>0);f=h*ur(c),c<gr&&(f-=d*(c-gr));var y=ur(s),E=Yn(s);a[0]=c*E-f*y,a[1]=c*y+f*E}return a}var o=2*vr/t,u=n*n;return e.invert=function(t,e){var a=t*t+e*e;if(a>u){var c=i(a),f=Xn(e,t),v=o*or(f/o),g=f-v;t=c*Yn(g),e=c*ur(g);for(var l=t-gr,s=ur(t),h=e/s,p=t<gr?1/0:0,d=10;;){var w=n*ur(h),R=n*Yn(h),P=ur(R),j=gr-R,y=(w-h*P)/j,E=jn(h,y);if(Un(p)<fr||!--d)break;h-=p=(h*s-y*l-e)/(s-2*l*(j*(R+h*w*Yn(R)-P)-w*(w-h*P))/(j*j))}c=n+yn(E,R,t)*(vr-n)/yn(E,R,vr),f=v+h,t=c*Yn(f),e=c*ur(f)}return r.geoAzimuthalEquidistantRaw.invert(t,e)},e}function jn(n,r){return function(t){var e=n*Yn(t);return t<gr&&(e-=r),i(1+e*e)}}function yn(n,r,t){for(var e=50,o=(t-r)/e,i=n(r)+n(t),u=1,a=r;u<e;++u)i+=2*n(a+=o);return.5*i*o}function En(){var n=6,t=30*wr,o=Yn(t),i=ur(t),u=r.geoProjectionMutator(Pn),a=u(t,n),c=a.stream,f=.01,v=-Yn(f*wr),g=ur(f*wr);return a.radius=function(r){return arguments.length?(o=Yn(t=r*wr),i=ur(t),u(t,n)):t*dr},a.lobes=function(r){return arguments.length?u(t,n=+r):n},a.stream=function(r){var t=a.rotate(),u=c(r),f=(a.rotate([0,0]),c(r));return a.rotate(t),u.sphere=function(){f.polygonStart(),f.lineStart();for(var r=0,t=2*vr/n,u=0;r<n;++r,u-=t)f.point(Xn(g*Yn(u),v)*dr,e(g*ur(u))*dr),f.point(Xn(i*Yn(u-t/2),o)*dr,e(i*ur(u-t/2))*dr);f.lineEnd(),f.polygonEnd()},u},a.rotate([90,-40]).scale(90).clipAngle(179.999)}function Mn(n,r,t,o,u,a,c,f){function v(i,v){if(!v)return[n*i/vr,0];var g=v*v,l=n+g*(r+g*(t+g*o)),s=v*(u-1+g*(a-f+g*c)),h=(l*l+s*s)/(2*s),p=i*e(l/h)/vr;return[h*ur(p),v*(1+g*f)+h*(1-Yn(p))]}return arguments.length<8&&(f=0),v.invert=function(v,g){var l,s,h=vr*v/n,p=g,d=50;do{var w=p*p,R=n+w*(r+w*(t+w*o)),P=p*(u-1+w*(a-f+w*c)),j=R*R+P*P,y=2*P,E=j/y,M=E*E,m=e(R/E)/vr,b=h*m,A=R*R,k=(2*r+w*(4*t+6*w*o))*p,G=u+w*(3*a+5*w*c),S=2*(R*k+P*(G-1)),z=2*(G-1),C=(S*y-j*z)/(y*y),B=Yn(b),q=ur(b),x=E*B,F=E*q,Q=h/vr*(1/i(1-A/M))*(k*E-R*C)/M,_=F-v,O=p*(1+w*f)+E-x-g,W=C*q+x*Q,I=x*m,T=1+C-(C*B-F*Q),D=F*m,H=W*D-T*I;if(!H)break;h-=l=(O*W-_*T)/H,p-=s=(_*D-O*I)/H}while((Un(l)>cr||Un(s)>cr)&&--d>0);return[h,p]},v}function mn(){return r.geoProjection(kr).scale(140)}function bn(){return r.geoProjection(Gr).scale(140)}function An(){return r.geoProjection(Sr).scale(120)}function kn(n,r){var t=n*n,e=r*r;return[n*(1-.162388*e)*(.87-952426e-9*t*t),r*(1+e/12)]}function Gn(){return r.geoProjection(kn).scale(120)}function Sn(){return r.geoProjection(zr).scale(120)}function zn(n){function r(r,e){var o=r>0?-.5:.5,i=n(r+o*vr,e);return i[0]-=o*t,i}var t=n(gr,0)[0]-n(-gr,0)[0];return n.invert&&(r.invert=function(r,e){var o=r>0?-.5:.5,i=n.invert(r+o*t,e),u=i[0]-o*vr;return u<-vr?u+=2*vr:u>vr&&(u-=2*vr),i[0]=u,i}),r}function Cn(n,r){var t=ir(n),o=ir(r),i=Yn(r),u=Yn(n)*i,a=ur(n)*i,c=ur(o*r);n=Un(Xn(a,c)),r=e(u),Un(n-gr)>cr&&(n%=gr);var f=Bn(n>vr/4?gr-n:n,r);return n>vr/4&&(c=f[0],f[0]=-f[1],f[1]=-c),f[0]*=t,f[1]*=-o,f}function Bn(n,r){if(r===gr)return[0,0];var t,o,u=ur(r),a=u*u,c=a*a,f=1+c,v=1+3*c,g=1-c,l=e(1/i(f)),s=g+a*f*l,h=(1-u)/s,p=i(h),d=h*f,w=i(d),R=p*g;if(0===n)return[0,-(R+a*w)];var P,j=Yn(r),y=1/j,E=2*u*j,M=(-3*a+l*v)*E,m=(-s*j-(1-u)*M)/(s*s),b=.5*m/p,A=g*b-2*a*p*E,k=a*f*m+h*v*E,G=-y*E,S=-y*k,z=-2*y*A,C=4*n/vr;if(n>.222*vr||r<vr/4&&n>.175*vr){if(t=(R+a*i(d*(1+c)-R*R))/(1+c),n>vr/4)return[t,t];var B=t,q=.5*t;t=.5*(q+B),o=50;do{var x=i(d-t*t),F=t*(z+G*x)+S*e(t/w)-C;if(!F)break;F<0?q=t:B=t,t=.5*(q+B)}while(Un(B-q)>cr&&--o>0)}else{t=cr,o=25;do{var Q=t*t,_=i(d-Q),O=z+G*_,W=t*O+S*e(t/w)-C,I=O+(S-G*Q)/_;t-=P=_?W/I:0}while(Un(P)>cr&&--o>0)}return[t,-R-a*i(d-t*t)]}function qn(n,r){for(var t=0,o=1,u=.5,a=50;;){var c=u*u,f=i(u),v=e(1/i(1+c)),g=1-c+u*(1+c)*v,l=(1-f)/g,s=i(l),h=l*(1+c),p=s*(1-c),d=h-n*n,w=i(d),R=r+p+u*w;if(Un(o-t)<fr||0===--a||0===R)break;R>0?t=u:o=u,u=.5*(t+o)}if(!a)return null;var P=e(f),j=Yn(P),y=1/j,E=2*f*j,M=(-3*u+v*(1+3*c))*E,m=(-g*j-(1-f)*M)/(g*g),b=.5*m/s,A=(1-c)*b-2*u*s*E,k=-2*y*A,G=-y*E,S=-y*(u*(1+c)*m+l*(1+3*c)*E);return[vr/4*(n*(k+G*w)+S*e(n/i(h))),P]}function xn(){return r.geoProjection(zn(Cn)).scale(240)}function Fn(n){function r(r,e){var o=Un(r)<gr,i=n(o?r:r>0?r-vr:r+vr,e),u=(i[0]-i[1])*sr,a=(i[0]+i[1])*sr;if(o)return[u,a];var c=t*sr,f=u>0^a>0?-1:1;return[f*u-ir(a)*c,f*a-ir(u)*c]}var t=n(gr,0)[0]-n(-gr,0)[0];return n.invert&&(r.invert=function(r,e){var o=(r+e)*sr,i=(e-r)*sr,u=Un(o)<.5*t&&Un(i)<.5*t;if(!u){var a=t*sr,c=o>0^i>0?-1:1,f=-c*(r+(i>0?1:-1)*a),v=-c*(e+(o>0?1:-1)*a);o=(-f-v)*sr,i=(f-v)*sr}var g=n.invert(o,i);return u||(g[0]+=o>0?vr:-vr),g}),r}function Qn(){return r.geoProjection(Fn(Cn)).scale(176.5).rotate([-90,-90,45]).clipAngle(179.999)}function _n(n,r,t){var e,o,i;return n?(e=On(n,t),r?(o=On(r,1-t),i=o[1]*o[1]+t*e[0]*e[0]*o[0]*o[0],[[e[0]*o[2]/i,e[1]*e[2]*o[0]*o[1]/i],[e[1]*o[1]/i,-e[0]*e[2]*o[0]*o[2]/i],[e[2]*o[1]*o[2]/i,-t*e[0]*e[1]*o[0]/i]]):[[e[0],0],[e[1],0],[e[2],0]]):(o=On(r,1-t),[[0,o[0]/o[1]],[1/o[1],0],[o[2]/o[1],0]])}function On(n,r){var t,o,f,v,g;if(r<cr)return v=ur(n),o=Yn(n),t=r*(n-v*o)/4,[v-t*o,o+t*v,1-r*v*v/2,n-t];if(r>=1-cr)return t=(1-r)/4,o=c(n),v=u(n),f=1/o,g=o*a(n),[v+t*(g-n)/(o*o),f-t*v*f*(g-n),f+t*v*f*(g+n),2*Vn(Zn(n))-gr+t*(g-n)/o];var l=[1,0,0,0,0,0,0,0,0],s=[i(r),0,0,0,0,0,0,0,0],h=0;for(o=i(1-r),g=1;Un(s[h]/l[h])>cr&&h<8;)t=l[h++],s[h]=(t-o)/2,l[h]=(t+o)/2,o=i(t*o),g*=2;f=g*l[h]*n;do v=s[h]*ur(o=f)/l[h],f=(e(v)+f)/2;while(--h);return[ur(f),v=Yn(f),v/Yn(f-o),f]}function Wn(n,r,t){var e=Un(n),o=Un(r),u=a(o);if(e){var c=1/ur(e),f=1/(ar(e)*ar(e)),v=-(f+t*(u*u*c*c)-1+t),g=(t-1)*f,l=(-v+i(v*v-4*g))/2;return[In(Vn(1/i(l)),t)*ir(n),In(Vn(i((l/f-1)/t)),1-t)*ir(r)]}return[0,In(Vn(u),1-t)*ir(r)]}function In(n,r){if(!r)return n;if(1===r)return nr(ar(n/2+lr));for(var t=1,e=i(1-r),o=i(r),u=0;Un(o)>cr;u++){if(n%vr){var a=Vn(e*ar(n)/t);a<0&&(a+=vr),n+=a+~~(n/vr)*vr}else n+=n;o=(t+e)/2,e=i(t*e),o=((t=o)-e)/2}return n/(er(2,u)*t)}function Tn(n,r){var t=(hr-1)/(hr+1),e=i(1-t*t),o=In(gr,e*e),u=-1,a=nr(ar(vr/4+Un(r)/2)),c=Zn(u*a)/i(t),f=Dn(c*Yn(u*n),c*ur(u*n)),v=Wn(f[0],f[1],e*e);return[-v[1],(r>=0?1:-1)*(.5*o-v[0])]}function Dn(n,r){var t=n*n,e=r+1,o=1-t-r*r;return[.5*((n>=0?gr:-gr)-Xn(o,2*n)),-.25*nr(o*o+4*t)+.5*nr(e*e+t)]}function Hn(n,r){var t=r[0]*r[0]+r[1]*r[1];return[(n[0]*r[0]+n[1]*r[1])/t,(n[1]*r[0]-n[0]*r[1])/t]}function Jn(){return r.geoProjection(zn(Tn)).scale(151.5)}function Kn(){return r.geoProjection(Fn(Tn)).scale(111.5).rotate([-90,-90,45]).clipAngle(179.999)}function Ln(n,r){var t=s(n,r);return[(t[0]+n/gr)/2,(t[1]+r)/2]}function Nn(){return r.geoProjection(Cr).scale(150)}var Un=Math.abs,Vn=Math.atan,Xn=Math.atan2,Yn=Math.cos,Zn=Math.exp,$n=Math.floor,nr=Math.log,rr=Math.max,tr=Math.min,er=Math.pow,or=Math.round,ir=Math.sign||function(n){return n>0?1:n<0?-1:0},ur=Math.sin,ar=Math.tan,cr=1e-6,fr=1e-12,vr=Math.PI,gr=vr/2,lr=vr/4,sr=Math.SQRT1_2,hr=i(2),pr=i(vr),dr=180/vr,wr=vr/180;s.invert=function(n,r){if(!(n*n+4*r*r>vr*vr+cr)){var t=n,e=r,u=25;do{var a,c=ur(t),f=ur(t/2),v=Yn(t/2),g=ur(e),l=Yn(e),s=ur(2*e),h=g*g,p=l*l,d=f*f,w=1-p*v*v,R=w?o(l*v)*i(a=1/w):a=0,P=2*R*l*f-n,j=R*g-r,y=a*(p*d+R*l*v*h),E=a*(.5*c*s-2*R*g*f),M=.25*a*(s*f-R*g*p*c),m=a*(h*v+R*d*l),b=E*M-m*y;if(!b)break;var A=(j*E-P*m)/b,k=(P*M-j*y)/b;t-=A,e-=k}while((Un(A)>cr||Un(k)>cr)&&--u>0);return[t,e]}},w.invert=function(n,r){if(n*=3/8,r*=3/8,!n&&Un(r)>1)return null;var t=n*n,o=r*r,u=1+t+o,g=i((u-i(u*u-4*r*r))/2),l=e(g)/3,s=g?v(Un(r/g))/3:f(Un(n))/3,h=Yn(l),p=c(s),d=p*p-h*h;return[2*ir(n)*Xn(a(s)*h,.25-d),2*ir(r)*Xn(p*ur(l),.25+d)]};var Rr=i(8),Pr=nr(1+hr);P.invert=function(n,r){if((e=Un(r))<Pr)return[n,2*Vn(Zn(r))-gr];var t,e,o=lr,i=25;do{var u=Yn(o/2),a=ar(o/2);o-=t=(Rr*(o-lr)-nr(a)-e)/(Rr-u*u/(2*a))}while(Un(t)>fr&&--i>0);return[n/(Yn(o)*(Rr-1/ur(o))),ir(r)*o]};var jr=m(hr/gr,hr,vr),yr=2.00276,Er=1.11072;A.invert=function(n,r){var t,e,o=yr*r,i=r<0?-lr:lr,u=25;do e=o-hr*ur(i),i-=t=(ur(2*i)+2*i-vr*ur(e))/(2*Yn(2*i)+2+vr*Yn(e)*hr*Yn(i));while(Un(t)>cr&&--u>0);return e=o-hr*ur(i),[n*(1/Yn(e)+Er/Yn(i))/yr,e]},S.invert=function(n,r){return[n/Yn(r),r]};var Mr=m(1,4/vr,vr);T.invert=function(n,r){var t=(t=r/pr-1)*t;return[t>0?n*i(vr/t)/2:0,e(1-t)]};var mr=i(3);K.invert=function(n,r){var t=3*e(r/(mr*pr));return[pr*n/(mr*(2*Yn(2*t/3)-1)),t]},Y.invert=function(n,r){var t=i(8/(3*vr)),e=r/t;return[n/(t*(1-Un(e)/vr)),e]},$.invert=function(n,r){var t=2-Un(r)/i(2*vr/3);return[n*i(6*vr)/(2*t),ir(r)*e((4-t*t)/3)]},rn.invert=function(n,r){var t=i(vr*(4+vr))/2;return[n*t/(1+i(1-r*r*(4+vr)/(4*vr))),r*t/2]},en.invert=function(n,r){var t=r*i((4+vr)/vr)/2,o=e(t),u=Yn(o);return[n/(2/i(vr*(4+vr))*(1+u)),e((o+t*(u+2))/(2+gr))]},un.invert=function(n,r){var t=i(2+vr),e=r*t/2;return[t*n/(1+Yn(e)),e]},cn.invert=function(n,r){var t=1+gr,o=i(t/2);return[2*n*o/(1+Yn(r*=o)),e((r+ur(r))/t)]};var br=3+2*hr;vn.invert=function(n,r){if(!(t=w.invert(n/1.2,1.065*r)))return null;var t,e=t[0],o=t[1],u=20;n/=br,r/=br;do{var a=e/2,c=o/2,f=ur(a),v=Yn(a),g=ur(c),l=Yn(c),s=Yn(o),h=i(s),p=g/(l+hr*v*h),d=p*p,R=i(2/(1+d)),P=hr*l+(v+f)*h,j=hr*l+(v-f)*h,y=P/j,E=i(y),M=E-1/E,m=E+1/E,b=R*M-2*nr(E)-n,A=R*p*m-2*Vn(p)-r,k=g&&sr*h*f*d/g,G=(hr*v*l+h)/(2*(l+hr*v*h)*(l+hr*v*h)*h),S=-.5*p*R*R*R,z=S*k,C=S*G,B=(B=2*l+hr*h*(v-f))*B*E,q=(hr*v*l*h+s)/B,x=-(hr*f*g)/(h*B),F=M*z-2*q/E+R*(q+q/y),Q=M*C-2*x/E+R*(x+x/y),_=p*m*z-2*k/(1+d)+R*m*k+R*p*(q-q/y),O=p*m*C-2*G/(1+d)+R*m*G+R*p*(x-x/y),W=Q*_-O*F;if(!W)break;var I=(A*Q-b*O)/W,T=(b*_-A*F)/W;e-=I,o=rr(-gr,tr(gr,o-T))}while((Un(I)>cr||Un(T)>cr)&&--u>0);return Un(Un(o)-gr)<cr?[0,o]:u&&[e,o]};var Ar=Yn(35*wr);ln.invert=function(n,r){var t=r/(1+Ar);return[n&&n/(Ar*i(1-t*t)),2*Vn(t)]},hn.invert=function(n,r){var t=Vn(r/pr),e=Yn(t),o=2*t;return[n*pr/2/(Yn(o)*e*e),o]};var kr=Mn(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555),Gr=Mn(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742),Sr=Mn(5/6*vr,-.62636,-.0344,0,1.3493,-.05524,0,.045);kn.invert=function(n,r){var t,e=n,o=r,i=50;do{var u=o*o;o-=t=(o*(1+u/12)-r)/(1+u/4)}while(Un(t)>cr&&--i>0);i=50,n/=1-.162388*u;do{var a=(a=e*e)*a;e-=t=(e*(.87-952426e-9*a)-n)/(.87-.00476213*a)}while(Un(t)>cr&&--i>0);return[e,o]};var zr=Mn(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762);Cn.invert=function(n,r){var t=ir(n),o=ir(r),i=-t*n,u=-o*r,a=u/i<1,c=qn(a?u:i,a?i:u),f=c[0],v=c[1],g=Yn(v);return a&&(f=-gr-f),[t*(Xn(ur(f)*g,-ur(v))+vr),o*e(Yn(f)*g)]},Tn.invert=function(n,r){var t=(hr-1)/(hr+1),e=i(1-t*t),o=In(gr,e*e),u=-1,a=_n(.5*o-r,-n,e*e),c=Hn(a[0],a[1]),f=Xn(c[1],c[0])/u;return[f,2*Vn(Zn(.5/u*nr(t*c[0]*c[0]+t*c[1]*c[1])))-gr]},Ln.invert=function(n,r){var t=n,e=r,u=25;do{var a,c=Yn(e),f=ur(e),v=ur(2*e),g=f*f,l=c*c,s=ur(t),h=Yn(t/2),p=ur(t/2),d=p*p,w=1-l*h*h,R=w?o(c*h)*i(a=1/w):a=0,P=.5*(2*R*c*p+t/gr)-n,j=.5*(R*f+e)-r,y=.5*a*(l*d+R*c*h*g)+.5/gr,E=a*(s*v/4-R*f*p),M=.125*a*(v*p-R*f*l*s),m=.5*a*(g*h+R*d*c)+.5,b=E*M-m*y,A=(j*E-P*m)/b,k=(P*M-j*y)/b;t-=A,e-=k}while((Un(A)>cr||Un(k)>cr)&&--u>0);return[t,e]};var Cr=Ln;n.geoAiry=l,n.geoAiryRaw=g,n.geoAitoff=h,n.geoAitoffRaw=s,n.geoArmadillo=d,n.geoArmadilloRaw=p,n.geoAugust=R,n.geoAugustRaw=w,n.geoBaker=j,n.geoBakerRaw=P,n.geoBerghaus=E,n.geoBerghausRaw=y,n.geoBoggs=k,n.geoBoggsRaw=A,n.geoBonne=B,n.geoBonneRaw=C,n.geoBottomley=x,n.geoBottomleyRaw=q,n.geoBromley=F,n.geoBromleyRaw=Mr,n.geoChamberlin=I,n.geoChamberlinRaw=W,n.geoCollignon=D,n.geoCollignonRaw=T,n.geoCraig=J,n.geoCraigRaw=H,n.geoCraster=L,n.geoCrasterRaw=K,n.geoCylindricalEqualArea=U,n.geoCylindricalEqualAreaRaw=N,n.geoCylindricalStereographic=X,n.geoCylindricalStereographicRaw=V,n.geoEckert1=Z,n.geoEckert1Raw=Y,n.geoEckert2=nn,n.geoEckert2Raw=$,n.geoEckert3=tn,n.geoEckert3Raw=rn,n.geoEckert4=on,n.geoEckert4Raw=en,n.geoEckert5=an,n.geoEckert5Raw=un,n.geoEckert6=fn,n.geoEckert6Raw=cn,n.geoEisenlohr=gn,n.geoEisenlohrRaw=vn,n.geoFahey=sn,n.geoFaheyRaw=ln,n.geoFoucaut=pn,n.geoFoucautRaw=hn,n.geoGilbert=Rn,n.geoGingery=En,n.geoGingeryRaw=Pn,n.geoGinzburg4=mn,n.geoGinzburg4Raw=kr,n.geoGinzburg5=bn,n.geoGinzburg5Raw=Gr,n.geoGinzburg6=An,n.geoGinzburg6Raw=Sr,n.geoGinzburg8=Gn,n.geoGinzburg8Raw=kn,n.geoGinzburg9=Sn,n.geoGinzburg9Raw=zr,n.geoGringorten=xn,n.geoGringortenRaw=Cn,n.geoGringortenQuincuncial=Qn,n.geoGuyou=Jn,n.geoGuyouRaw=Tn,n.geoMollweide=b,n.geoMollweideRaw=jr,n.geoPierceQuincuncial=Kn,n.geoSinusoidal=z,n.geoSinusoidalRaw=S,n.geoWinkel3=Nn,n.geoWinkel3Raw=Cr,Object.defineProperty(n,"__esModule",{value:!0})});
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.graticule {
fill: none;
stroke: #777;
stroke-width: 0.5px;
stroke-opacity: 0.5;
}
.land {
fill: #222;
}
.boundary {
fill: none;
stroke: #fff;
stroke-width: 0.5px;
}
</style>
<svg width="960" height="960"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>
<script src="//d3js.org/topojson.v1.min.js"></script>
<script src="d3-geo-projection.min.js"></script>
<script>
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
g = svg.append("g").attr("transform", "rotate(90 480,480)");
var projection = d3.geoPierceQuincuncial()
.scale(214)
.translate([width / 2, height / 2])
.rotate([0, 0, 45])
.precision(0.1)
.clipAngle(90);
var path = d3.geoPath()
.projection(projection);
var graticule = d3.geoGraticule();
g.append("path")
.datum(graticule)
.attr("class", "graticule")
.attr("d", path);
g.append("path")
.datum({type: "Sphere"})
.attr("class", "sphere")
.attr("d", path)
.attr("fill", "none")
.attr("stroke", "black");
d3.json("/mbostock/raw/4090846/world-50m.json", function(error, world) {
if (error) throw error;
g.insert("path", ".graticule")
.datum(topojson.feature(world, world.objects.land))
.attr("class", "land")
.attr("d", path);
g.insert("path", ".graticule")
.datum(topojson.mesh(world, world.objects.countries, function(a, b) { return a !== b; }))
.attr("class", "boundary")
.attr("d", path);
});
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment