diff options
| -rw-r--r-- | parsecalldata.pde | 93 | ||||
| -rw-r--r-- | vodaviz.pde | 76 |
2 files changed, 150 insertions, 19 deletions
diff --git a/parsecalldata.pde b/parsecalldata.pde index f346381..f82c0e3 100644 --- a/parsecalldata.pde +++ b/parsecalldata.pde @@ -1,10 +1,13 @@ //BT IRELAND MTM,Destination CID Name,VIA,Calls,MINS,ALOC,% User,ASR,NER 02 -boolean DEBUG=false; +boolean DEBUG=true; class country { String name; float calls,mins; RShape outline; + country() { + super(); + } country(String n,float c,float m,RShape shp){ name=n; calls=c; @@ -26,7 +29,7 @@ class country { while (searching>0&&searching<tries) { np=new RPoint(random(tl.x,br.x),random(tl.y,br.y)); if(outline.contains(np)) searching=0; - if (DEBUG) println(name+"; try "+searching+": "+np.x+","+np.y+" bounds: "+tl.x+","+tl.y+" - "+br.x+","+br.y+": "+(searching>0)); + //if (DEBUG) println(name+"; try "+searching+": "+np.x+","+np.y+" bounds: "+tl.x+","+tl.y+" - "+br.x+","+br.y+": "+(searching>0)); if (searching==10||searching==100||searching==1000||searching==10000||searching==100000) { println(name+"; try "+searching+": MISS at "+np.x+","+np.y+" bounds: "+tl.x+","+tl.y+" - "+br.x+","+br.y); } @@ -36,9 +39,82 @@ class country { } } +class weightedpixel { + float bright; + RPoint pt; + float index; //index weighted from 0-1 + weightedpixel(RPoint _p,float _b) { + pt=_p; + bright=_b; + } +} + +class bitmapcountry extends country { + //examines a bitmap + //builds a table of population desnsity + + //look at it from the POV of how its gonna be used + //getpoints(int num) should be able to return an array of points to draw from + //should be dithered + //has to distribute the points around the brightest points first + //distribute in proportion to their brightness - weighted + + //table of pixels: if within shape: + //sample brightness, keep running total and store normalised weighted index for quick searching + + float xo,xs,yo,ys; + Vector<weightedpixel> points = new Vector<weightedpixel>(); + bitmapcountry(String n,float c,float m,RShape shp) { + super(n,c,m,shp); + } + void analyse(float _xo,float _xs,float _yo,float _ys) { + xo=_xo; + xs=_xs; + yo=_yo; + ys=_ys; + //scan country outline by pixel + RPoint tl=outline.getTopLeft(); + RPoint br=outline.getBottomRight(); + RPoint tlp=normpix(tl); + RPoint brp=normpix(br); + float pixstep=(br.x-tl.x)/lightmap.width; + float totalbright=0; + for (int i=0;i<brp.x-tlp.x;i++) { + for (int j=0;j<brp.y-tlp.y;j++) { + RPoint pn=new RPoint(tl.x+(i*pixstep),tl.y+(j*pixstep)); + if(outline.contains(pn)) { + float bn=brightness(lightmap.get((int)brp.x+i,(int)brp.y+j)); + points.add(new weightedpixel(normalise(pn),bn)); + totalbright +=bn; + } + } + } + float runbright=0; + float bfactor=1.0/totalbright; + for (int i=0;i<points.size();i++) { + runbright+=points.get(i).bright*bfactor; + points.get(i).index=runbright; + } + if (DEBUG) println(name+"; bounds: "+tl.x+","+tl.y+" - "+points.size()+" pixels"); + + } + RPoint normalise(RPoint p) { + 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); + } + RPoint normpix(RPoint p) { + float px=((p.x-xo)/xs)*lightmap.width; + float py=((p.y-yo)/ys)*lightmap.height; + + return new RPoint(px,py); + } +} + class calldata { - Vector<country> countries = new Vector<country>(); + Vector<bitmapcountry> countries = new Vector<bitmapcountry>(); HashMap<String, Integer> outlines = new HashMap<String, Integer>(); calldata(String[][] data,RShape shp) { @@ -50,7 +126,7 @@ class calldata { //detect number of countries int num=0; if (outlines.containsKey(data[0][1].substring(0, 3))) { - countries.add(new country(data[0][1],0,0,shp.children[outlines.get(data[0][1].substring(0, 3))])); + countries.add(new bitmapcountry(data[0][1],0.0,0.0,shp.children[outlines.get(data[0][1].substring(0, 3))])); } for (int i=0; i < data.length; i++) { @@ -60,15 +136,16 @@ class calldata { else { if (outlines.containsKey(data[i][1].substring(0, 3))) { - countries.add(new country(data[i][1],Float.valueOf(data[i][3].trim()).floatValue(),Float.valueOf(data[i][4].trim()).floatValue(),shp.children[outlines.get(data[i][1].substring(0, 3))])); + countries.add(new bitmapcountry(data[i][1],Float.valueOf(data[i][3].trim()).floatValue(),Float.valueOf(data[i][4].trim()).floatValue(),shp.children[outlines.get(data[i][1].substring(0, 3))])); } } } - if (DEBUG) { + for (int i=0; i < countries.size(); i++) { - countries.get(i).printOut(); + //if (DEBUG) countries.get(i).printOut(); + countries.get(i).analyse(18.279,746.302,129.314,374.293); } - } + } country getcountry(int w) { return countries.get(w); diff --git a/vodaviz.pde b/vodaviz.pde index cf7fcf7..7d4ed25 100644 --- a/vodaviz.pde +++ b/vodaviz.pde @@ -79,6 +79,9 @@ The intermediate latitude and longitude is then given by: import processing.pdf.*; import geomerative.*; +float log10 (float x) { + return (log(x) / log(10)); +} class pointNormalise { //take pixel coords and turn into lat/lng radians float xo,xs,yo,ys; @@ -130,6 +133,16 @@ class sphereMap { } } +RPoint screenMapper(RPoint p) { + p.x=((p.x*getWidth())/(PI*2))+(getWidth()/2); + p.y=((p.y*getHeight())/PI)+(getHeight()/2); + return p; +} + +RPoint plerp(RPoint s,RPoint e,float a) { + return new RPoint(lerp(s.x,e.x,a),lerp(s.y,e.y,a)); +} + 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)); } @@ -156,21 +169,27 @@ calldata calls; country Ireland; +PImage lightmap; + void setup(){ - println("vodaviz v0.11"); + println("vodaviz v0.21"); RG.init(this); //mode="PDF"; - size(832,220); //,PDF, "testoutput.pdf"); //P3D); //832,220); //nb pdf is 800x600 + if (mode=="PDF") size(832,220,PDF, "vodaviz_test_080212.pdf"); //P3D); //832,220); //nb pdf is 800x600 + else size(832,220); //,PDF, "testoutput.pdf"); //P3D); //832,220); //nb pdf is 800x600 smooth(); float m = millis(); shp = RG.loadShape("countries_named_mercator.svg"); //test_drawing.svg"); //world_countries_outlines_split.svg"); - pnorm = new pointNormalise(26,736,90,390); + pnorm = new pointNormalise(18.279,746.302,129.314,374.293); ptrans = new pointTransform(); - smap = new sphereMap(); + smap = new sphereMap(); + + lightmap=loadImage("earthlights2_dmsp_big.jpg"); + image(lightmap,0,0,getWidth(),getHeight()); RG.ignoreStyles(); println("loaded svg in "+((millis()-m)*.001)+" seconds"); @@ -178,7 +197,7 @@ void setup(){ data=new csvloader("calls.csv"); calls=new calldata(data.data,shp); - background(0,0,0); + background(255,255,255); noFill(); stroke(255); strokeWeight(.02); @@ -191,6 +210,8 @@ void setup(){ println("40% of LAX to JFK:"+LmJ.y+","+LmJ.x+" radians"); } + + } int i=0; @@ -199,8 +220,10 @@ int j=0; void draw() { //pick a random colour - stroke(random(150)+100,random(150)+100,random(150)+100); + stroke(random(150)+100,random(150)+100,random(150)+100,10); + if (false) //draw globe + { if (true) { //draw countries beginShape(); for (int k=0;k<calls.getcountry(i).outline.paths[0].commands.length;k++) { @@ -210,13 +233,11 @@ void draw() { 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"); + //println("drawing "+calls.getcountry(i).name+": "+calls.getcountry(i).outline.paths[0].commands.length+" points"); } if (true) { - //pick a random colour - 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); @@ -232,11 +253,44 @@ void draw() { endShape(); } } - println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls"); + //println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls"); } + + } + else + { + 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=screenMapper(pnorm.alise(sp)); + + vertex(dp.x,dp.y); //,z); //z); + } + endShape(); + //println("drawing "+calls.getcountry(i).name+": "+calls.getcountry(i).outline.paths[0].commands.length+" points"); + } + if (true) { //draw lines + for (int j=0;j<log10(calls.countries.get(i).calls)*100;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=screenMapper(pnorm.alise(s)); + RPoint Ep=screenMapper(pnorm.alise(e)); + RPoint Mp=plerp(Sp,Ep,0.75); + 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)); + bezier(Sp.x, Sp.y, Sp.x, Sp.y-((getHeight()-Sp.y)*.1), Ep.x, Ep.y-((getHeight()-Ep.y)*.1), Ep.x, Ep.y); + endShape(); + } + } + //println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls"); + } + } - i++; + i++; //} if (i==calls.countries.size()-1) { |
