summaryrefslogtreecommitdiff
path: root/vodaviz.pde
diff options
context:
space:
mode:
authorgit@eclectronics.org <git@eclectronics.org@eclectronics.org>2012-02-13 18:39:50 +0000
committergit@eclectronics.org <git@eclectronics.org@eclectronics.org>2012-02-13 18:39:50 +0000
commit1a5a6a7a34662b854b364a56436b3d015883a0b5 (patch)
tree88cca0c9640340c06927bd4aa1fcd53c095b7e15 /vodaviz.pde
parentfaf27b06657efcd4d3defad8e4babed88a8df32c (diff)
added bezier stroke
Diffstat (limited to 'vodaviz.pde')
-rw-r--r--vodaviz.pde261
1 files changed, 158 insertions, 103 deletions
diff --git a/vodaviz.pde b/vodaviz.pde
index ea103a3..2b39363 100644
--- a/vodaviz.pde
+++ b/vodaviz.pde
@@ -6,8 +6,8 @@
//
//416 x 110 in. ~ 62400x16500 ~ 1029 mpx ~ 2945 MB ram to open
//
-//CousinMarriageWorld.svg, nominally 940 × 470 pixels, file size: 1.99 MB
-//World_map_(Miller_cylindrical_projection,_blank).svg‎, nominally 634 × 477 pixels, file size: 1.84 MB
+//CousinMarriageWorld.svg, nominally 940 × 470 pixels, file size: 1.99 MB
+//World_map_(Miller_cylindrical_projection,_blank).svg‎, nominally 634 × 477 pixels, file size: 1.84 MB
//wikimedia
//
//http://www.vectortemplates.com/vector-world-map.php
@@ -39,7 +39,7 @@
a- the 3D position of a point A that is to be projected.
c- the 3D position of a point C representing the camera.
- O- The orientation of the camera (represented, for instance, by Tait–Bryan angles).
+ O- The orientation of the camera (represented, for instance, by Tait–Bryan angles).
e- the viewer's position relative to the display surface.[1]
@@ -73,12 +73,19 @@ The intermediate latitude and longitude is then given by:
float z = A*sin(lat1) + B*sin(lat2);
mp.y=atan2(z,sqrt(x^2+y^2));
mp.x=atan2(y,x);
+
+
+
+ drawing - circles (fixed diameter), closed shape made of 2 bezier curves
*/
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;
@@ -88,38 +95,34 @@ class pointNormalise {
yo=_yo;
ys=_ys;
}
- RPoint alise(RPoint in) {
- //formalise
- float px=(((in.x-xo)/xs)*PI*2); //26)/736);
- float py=((in.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 {
-
- RPoint map(float _x,float _y,float _r) {
- //transform
- float px=((_x-PI)*0.25)+(PI/2); //(((_x-0.5)*0.25)+.25); //front half of sphere
- float py=((_y-(PI/2))*0.3)+(PI/2); //((_y-0.5)*0.3)+0.5;
-
-
- //map to 3D curve
- float r=getHeight()*4*_r;
- float x=r*cos(px)*(sin(py)) *2;
- float z=r*sin(px)*(sin(py))-985;
- float y=r*cos(py)+(getHeight()*0.5)-210;
+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 {
- /*
- //map to small sphere
- float r=getHeight()/2;
- float x=r*cos(px)*(sin(py));
- float z=r*sin(px)*(sin(py))-105;
- float y=r*cos(py);
- */
+ RPoint per(RPoint p,float _r) {
+
+ //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
@@ -127,129 +130,180 @@ class pointMapper {
//(dy-ey)(ez/dz)
//rotate camera
+
+ //transform into 2D plane @100
return new RPoint(x*(100/z),y*(100/z));
- }
+ }
+}
+
+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));
+}
+
+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;
csvloader data;
calldata calls;
-country Ireland;
+bitmapcountry Ireland;
+
+PImage lightmap;
void setup(){
- println("vodaviz v0.11");
+ println("vodaviz v0.21");
RG.init(this);
- mode="PDF";
- size(832,220,PDF, "testoutput0602.pdf"); //P3D); //832,220); //nb pdf is 800x600
+ //mode="PDF";
+ 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);
- shpmap = new pointMapper();
+ pnorm = new pointNormalise(18.279,746.302,129.314,374.293);
+ ptrans = new pointTransform();
+ smap = new sphereMap();
+
+ lightmap=loadImage("earthlights2_dmsp_big.jpg");
+
RG.ignoreStyles();
println("loaded svg in "+((millis()-m)*.001)+" seconds");
- Ireland=new country("Ireland",0,0,shp.children[0]);
+ Ireland=new bitmapcountry("Ireland",0,0,shp.children[0]);
+ Ireland.analyse(18.279,746.302,129.314,374.293);
data=new csvloader("calls.csv");
calls=new calldata(data.data,shp);
- background(0,0,0);
+ background(255,255,255);
noFill();
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;
int j=0;
void draw() {
-
- //for (int i=0;i<calls.countries.size();i++) {
-
+ //if (i==0) image(lightmap,0,0,getWidth(),getHeight());
+
+ //pick a random colour
+ stroke(random(150)+10,random(150)+10,random(150)+10);
+
+ if (true) //draw globe
+ {
+ 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);
+
+ 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");
+ }
- //draw outlines
-
-
- //stroke(255);
- beginShape();
- for (int k=0;k<calls.getcountry(i).outline.paths[0].commands.length;k++) {
- RPoint sp=pnorm.alise(calls.getcountry(i).outline.paths[0].commands[k].startPoint);
- RPoint dp=shpmap.map(sp.x,sp.y,1);
-
- vertex(dp.x+(getWidth()/2),dp.y+(getHeight()/2)); //,z); //z);
- }
- endShape();
- //i++;
-
- //OR
-
-
-
- //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){ //point found
- RPoint Sp=shpmap.map(sp.x,sp.y,1);
- RPoint Ep=shpmap.map(ep.x,ep.y,1);
-
- //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))));
+ if (true) {
+ for (int j=0;j<calls.countries.get(i).calls*.001;j++) {
+ RPoint s=calls.countries.get(i).getpoint();
+ RPoint e=Ireland.getpoint();
+ 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();
+ }
+ }
+ //println("plotting "+calls.countries.get(i).name+": "+calls.countries.get(i).calls+" calls");
+ }
+
+ }
+ else //draw 2D
+ {
+ 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));
- RPoint Mp=shpmap.map(mp.x,mp.y,1.04);
- RPoint B1=shpmap.map(sp.x,sp.y,1.04);
- RPoint B2=shpmap.map(ep.x,ep.y,1.04);
- 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));
- vertex(Sp.x+(getWidth()/2),Sp.y+(getHeight()/2));
- bezierVertex(Sp.x+(getWidth()/2),Sp.y+(getHeight()/2),B1.x+(getWidth()/2),B1.y+(getHeight()/2),Mp.x+(getWidth()/2),Mp.y+(getHeight()/2));
- bezierVertex(B2.x+(getWidth()/2),B2.y+(getHeight()/2),Ep.x+(getWidth()/2),Ep.y+(getHeight()/2),Ep.x+(getWidth()/2),Ep.y+(getHeight()/2));
- endShape();
+ vertex(dp.x,dp.y); //,z); //z);
}
-
- 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;
+ 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();
+ RPoint e=Ireland.getpoint();
+ 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++;
//}
if (i==calls.countries.size()-1) {
- println("finished");
- noLoop();
- if (mode=="PDF") exit();
+ println("finished");
+ noLoop();
+ if (mode=="PDF") exit();
}
-
}
void mousePressed() {
@@ -258,3 +312,4 @@ void mousePressed() {
+