... et il y a nul doute que quelqu'un finira tôt ou tard par développer une extension sur ce thème.
En attendant, deux exemples :
- Un exemple compliqué, issu de la galerie officielle, et que l'on doit à Jens Schwaiger : la projection de Mollweide.Sur Wikipedia, quelqu'un a écrit :La projection de Mollweide est une projection cartographique pseudo-cylindrique employée le plus souvent pour les planisphères de la Terre (ou du ciel). Connue aussi sous le nom de projection de Babinet ou projection elliptique, le qualificatif de projection équivalente de Mollweide indique qu'elle privilégie la conservation des surfaces à la conservation des angles (projection conforme) : c'est pourquoi on y recourt principalement pour les cartes de l'ensemble de la sphère reproduites sur une surface réduite.
Cette projection fut publiée pour la première fois en 1805 par le mathématicien et astronome prussien Karl (ou Carl) Brandan Mollweide (1774 – 1825) de Leipzig, en tant qu’alternative à la Projection de Mercator. Jacques Babinet en vulgarisa l’emploi en 1857, sous le nom de projection homolographique[1].
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***- CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
- size(300);
- real findtheta(real phi, real epsilon=realEpsilon) {
- real nwtn(real x, real y) {return x-(2x+sin(2x)-y)/(2+2*cos(2x));};
- real y=pi*sin(phi);
- if(y == 0) return 0.0;
- if(abs(y) == 1) return pi/2;
- real startv=y/4;
- real endv=nwtn(startv,y);
- if(epsilon < 500*realEpsilon) epsilon=500*realEpsilon;
- while(abs(endv-startv) > epsilon) {startv=endv; endv=nwtn(startv,y);};
- return endv;
- }
- pair mollweide(real lambda, real phi, real lambda0=0){
- static real c1=2*sqrt(2)/pi;
- static real c2=sqrt(2);
- real theta=findtheta(phi);
- return(c1*(lambda-lambda0)*cos(theta), c2*sin(theta));
- }
- guide gfrompairs(pair[] data){
- guide gtmp;
- for(int i=0; i < data.length; ++i) {
- pair tmp=mollweide(radians(data[i].y),radians(data[i].x));
- gtmp=gtmp--tmp;
- }
- return gtmp;
- }
- string datafile="../data/worldmap.dat";
- file in=input(datafile,comment="/").line();
- pair[][] arrarrpair=new pair[][] ;
- int cnt=-1;
- bool newseg=false;
- while(true) {
- if(eof(in)) break;
- string str=in;
- string[] spstr=split(str,"");
- if(spstr[0] == "#") {++cnt; arrarrpair[cnt]=new pair[] ; newseg=true;}
- if(spstr[0] != "#" && newseg) {
- string[] spstr1=split(str,'\t'); // separator is TAB not SPACE
- pair tmp=((real) spstr1[1],(real) spstr1[0]);
- arrarrpair[cnt].push(tmp);
- }
- }
- for(int i=0; i < arrarrpair.length; ++i)
- draw(gfrompairs(arrarrpair[i]),1bp+black);
- pair[] constlong(real lambda, int np=100) {
- pair[] tmp;
- for(int i=0; i <= np; ++i) tmp.push((-90+i*180/np,lambda));
- return tmp;
- }
- pair[] constlat(real phi, int np=100) {
- pair[] tmp;
- for(int i=0; i <= 2*np; ++i) tmp.push((phi,-180+i*180/np));
- return tmp;
- }
- for(int j=1; j <= 5; ++j) draw(gfrompairs(constlong(-180+j/6*360)),white);
- draw(gfrompairs(constlong(-180)),1.5bp+white);
- draw(gfrompairs(constlong(180)),1.5bp+white);
- for(int j=0; j <= 12; ++j) draw(gfrompairs(constlat(-90+j/6*180)),white);
- close(in);
Retrouver le code complet de Jens, avec ses commentaires, dans le fichier examples/worldmap.asy du dossier d'installation d'Asymptote 2.03 ou supérieure. - Un exemple plus simple de mon cru : une carte classique de mon département : 59, le Nord.
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***- CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
- size(200);
- file fich=input("../data/59-Nord.txt");
- string ligne;
- while((find(ligne,"[Limites XY]")==-1)&&eof(fich)!=true) ligne=fich;
- while(eof(fich)!=true){
- ligne=fich;
- string[] coor=split(ligne);
- path p;
- for(int k=0; k<coor.length; ++k)
- {
- real[] coor0=(real[]) split(coor[k],",");
- p=p--(coor0[0],coor0[1]);
- }
- draw(p,.5bp+blue);
- }