diff options
Diffstat (limited to 'vodaviz.pde')
| -rw-r--r-- | vodaviz.pde | 151 |
1 files changed, 87 insertions, 64 deletions
diff --git a/vodaviz.pde b/vodaviz.pde index f29001c..cf7fcf7 100644 --- a/vodaviz.pde +++ b/vodaviz.pde @@ -88,26 +88,34 @@ class pointNormalise { yo=_yo; ys=_ys; } - RPoint alise(float _x,float _y) { - //formalise - float px=((_x-xo)/xs)*PI*2; //26)/736); - float py=((_y-yo)/ys)*PI; //90)/390); + RPoint alise(RPoint p) { + //normalise + float px=(((p.x-xo)/xs)-0.5)*PI*2; //26)/736); + float py=(((p.y-yo)/ys)-0.5)*PI; //90)/390); return new RPoint(px,py); } } -class pointMapper { +class pointTransform { + + RPoint form(RPoint in) { + //transform + return new RPoint (((in.x*0.25)+(PI/2)),((in.y)*0.3)+(PI/2)); //front half of sphere + } + +} + +class sphereMap { - //transform - float px=(((_x-0.5)*0.25)+.25); //front half of sphere - float py=((_y-0.5)*0.3)+0.5; + RPoint per(RPoint p,float _r) { - //map to 3D curve - float r=getHeight()*4; - float x=r*cos(px*PI*2)*(sin(py*PI)) *2; - float z=r*sin(px*PI*2)*(sin(py*PI))-985; - float y=r*cos(py*PI)+(getHeight()*0.5)-210; + + //map to 3D sphere + float r=getHeight()*_r; + float x=r*cos(p.x)*(sin(p.y)) *2; + float z=r*sin(p.x)*(sin(p.y))-985; + float y=r*cos(p.y)+(getHeight()*0.5)-210; //camera at 0,0,0 //screen plane at 0,0,100 @@ -115,14 +123,31 @@ class pointMapper { //(dy-ey)(ez/dz) //rotate camera + + //transform into 2D plane @100 return new RPoint(x*(100/z),y*(100/z)); } } +float GSphereDist(RPoint p1,RPoint p2) { + return acos(sin(p1.y)*sin(p2.y)+cos(p1.y)*cos(p2.y)*cos(p1.x-p2.x)); +} + +RPoint GCircFract(RPoint sp,RPoint ep,float f) { + float d=GSphereDist(sp,ep); + float A=sin((1-f)*d)/sin(d); + float B=sin(f*d)/sin(d); + float x = A*cos(sp.y)*cos(sp.x) + B*cos(ep.y)*cos(ep.x); + float y = A*cos(sp.y)*sin(sp.x) + B*cos(ep.y)*sin(ep.x); + float z = A*sin(sp.y) + B*sin(ep.y); + return new RPoint(atan2(y,x),atan2(z,sqrt(pow(x,2)+pow(y,2)))); +} + RShape shp; pointNormalise pnorm; -pointMapper shpmap; +pointTransform ptrans; +sphereMap smap; String mode; @@ -144,7 +169,8 @@ void setup(){ shp = RG.loadShape("countries_named_mercator.svg"); //test_drawing.svg"); //world_countries_outlines_split.svg"); pnorm = new pointNormalise(26,736,90,390); - shpmap = new pointMapper(); + ptrans = new pointTransform(); + smap = new sphereMap(); RG.ignoreStyles(); println("loaded svg in "+((millis()-m)*.001)+" seconds"); @@ -157,9 +183,14 @@ void setup(){ stroke(255); strokeWeight(.02); - //pick a random colour - stroke(random(200)+50, random(200)+50,random(200)+50); - println("plotting "+calls.countries.get(0).name+": "+calls.countries.get(0).calls+" calls"); + if (false) { //check worked example http://williams.best.vwh.net/avform.htm#Example + RPoint LAX=new RPoint(2.066470,0.592539); + RPoint JFK=new RPoint(1.287762,0.709186); + println("LAX to JFK:"+GSphereDist(LAX,JFK)+" radians"); + RPoint LmJ=GCircFract(LAX,JFK,0.4); + println("40% of LAX to JFK:"+LmJ.y+","+LmJ.x+" radians"); + } + } int i=0; @@ -167,60 +198,52 @@ int j=0; void draw() { - //for (int i=0;i<calls.countries.size();i++) { + //pick a random colour + stroke(random(150)+100,random(150)+100,random(150)+100); - /* - beginShape(); - for (int k=0;k<calls.getcountry(i).outline.paths[0].commands.length;k++) { - RPoint sp=calls.getcountry(i).outline.paths[0].commands[k].startPoint; - RPoint dp=shpmap.map(sp.x,sp.y); - - vertex(dp.x+(getWidth()/2),dp.y+(getHeight()/2)); //,z); //z); - } - endShape(); - */ - - //pick a random colour - //stroke(random(100)+100, random(100)+100,random(100)+100); - //for (int j=0;j<calls.countries.get(i).calls;j++) { - RPoint sp=pnorm.alise(calls.countries.get(i).getpoint(100)); - RPoint ep=pnorm.alise(Ireland.getpoint(100)); - if (sp.x>0&&ep.x>0){ - RPoint Sp=shpmap.map(sp.x,sp.y); - RPoint Ep=shpmap.map(ep.x,ep.y); + if (true) { //draw countries + beginShape(); + for (int k=0;k<calls.getcountry(i).outline.paths[0].commands.length;k++) { + RPoint sp=calls.getcountry(i).outline.paths[0].commands[k].startPoint; + RPoint dp=smap.per(ptrans.form(pnorm.alise(sp)),4); - //find point along path - - float f=0.8; //fraction along path; - float d=acos(sin(sp.y)*sin(ep.y)+cos(sp.y)*cos(ep.y)*cos(sp.x-ep.x)); - float A=sin((1-f)*d)/sin(d); - float B=sin(f*d)/sin(d); - float x = A*cos(sp.y)*cos(sp.x) + B*cos(ep.y)*cos(ep.x); - float y = A*cos(sp.y)*sin(sp.x) + B*cos(ep.y)*sin(ep.x); - float z = A*sin(sp.y) + B*sin(ep.y); - RPoint mp=new RPoint(atan2(y,x),atan2(z,sqrt(pow(x,2)+pow(y,2)))); + vertex(dp.x+(getWidth()/2),dp.y+(getHeight()/2)); //,z); //z); + } + endShape(); + println("drawing "+calls.getcountry(i).name+": "+calls.getcountry(i).outline.paths[0].commands.length+" points"); + } + + + if (true) { + //pick a random colour - RPoint Mp=shpmap.map(mp.x,mp.y); - beginShape(); - line(Sp.x+(getWidth()/2),Sp.y+(getHeight()/2),Mp.x+(getWidth()/2),Mp.y+(getHeight()/2)); - line(Mp.x+(getWidth()/2),Mp.y+(getHeight()/2),Ep.x+(getWidth()/2),Ep.y+(getHeight()/2)); - endShape(); + for (int j=0;j<calls.countries.get(i).calls*.001;j++) { + RPoint s=calls.countries.get(i).getpoint(100); + RPoint e=Ireland.getpoint(100); + if (s.x>0&&e.x>0){ //point found + RPoint sp=ptrans.form(pnorm.alise(s)); + RPoint ep=ptrans.form(pnorm.alise(e)); + RPoint Sp=smap.per(sp,4); + RPoint Ep=smap.per(ep,4); + RPoint Mp=smap.per(GCircFract(sp,ep,0.8),4.1); + beginShape(); + line(Sp.x+(getWidth()/2),Sp.y+(getHeight()/2),Mp.x+(getWidth()/2),Mp.y+(getHeight()/2)); + line(Mp.x+(getWidth()/2),Mp.y+(getHeight()/2),Ep.x+(getWidth()/2),Ep.y+(getHeight()/2)); + endShape(); + } } - //} - j=j+1; - if (j>(calls.countries.get(i).calls*.01)){ - i++; - stroke(random(200)+50, random(200)+50,random(200)+50); - println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls"); - j=0; - } + println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls"); + } + + + i++; //} if (i==calls.countries.size()-1) { - println("finished"); - noLoop(); + println("finished"); + noLoop(); + if (mode=="PDF") exit(); } - //if (mode=="PDF") exit(); } void mousePressed() { |
