summaryrefslogtreecommitdiff
path: root/vodaviz.pde
diff options
context:
space:
mode:
Diffstat (limited to 'vodaviz.pde')
-rw-r--r--vodaviz.pde151
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() {