diff options
Diffstat (limited to 'bezierstroke.pde')
| -rw-r--r-- | bezierstroke.pde | 198 |
1 files changed, 173 insertions, 25 deletions
diff --git a/bezierstroke.pde b/bezierstroke.pde index d7fc939..406e1c4 100644 --- a/bezierstroke.pde +++ b/bezierstroke.pde @@ -1,5 +1,105 @@ import geomerative.*; +//drawing commands and utils for vodaviz + +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; + pointNormalise(float _xo,float _xs,float _yo,float _ys) { + xo=_xo; + xs=_xs; + yo=_yo; + ys=_ys; + } + 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 pointTransform { + + RPoint form(RPoint in) { + //transform + return new RPoint (((in.x*0.053)+(PI/2)-.01),((in.y)*0.14)+(PI/2)-.1); //front half of sphere + } + +} + +class sphereMap { + + RPoint per(RPoint p,float _r) { + + + //map to 3D sphere + float r=getHeight()*_r; + float x=r*cos(p.x)*(sin(p.y)) *4; + float z=r*sin(p.x)*(sin(p.y)) -985; + float y=r*cos(p.y)+(getHeight()*1)-330; + + //camera at 0,0,0 + //screen plane at 0,0,100 + //(dx-ex)(ez/dz) + //(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) { + //interpolates two lat-lng points on a great circle + 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)))); +} +void ellipse3d(RPoint pos,float s,float r){ + //take ellipse coord in UV space + //return in 3d globe space + float er=s*0.5; + curveTightness(-0.67); + RPoint s1=smap.per(new RPoint(pos.x-er,pos.y),r); + RPoint s2=smap.per(new RPoint(pos.x,pos.y-er),r); + RPoint s3=smap.per(new RPoint(pos.x+er,pos.y),r); + RPoint s4=smap.per(new RPoint(pos.x,pos.y+er),r); + beginShape(); + curveVertex(s1.x+hw, s1.y+hh); + curveVertex(s2.x+hw, s2.y+hh); + curveVertex(s3.x+hw, s3.y+hh); + curveVertex(s4.x+hw, s4.y+hh); + curveVertex(s1.x+hw, s1.y+hh); + curveVertex(s2.x+hw, s2.y+hh); + curveVertex(s3.x+hw, s3.y+hh); + endShape(); +} + class bezierstroke { float startsize,endsize,linewidth,mpfract,raisefract,bezierfract; bezierstroke(float _s,float _e,float _l,float _m,float _r,float _b){ @@ -110,22 +210,43 @@ class gradientstroke { } -class gradientstroke3D { - float startsize,endsize,mpfract,raisefract,bezierfract; - float[] transpos; - float[] transamt; +class line3D { + float linewidth; color col; sphereMap smap; float hw,hh; + line3D(float _l,color _c,sphereMap _sp){ + linewidth=_l; + col=_c; + smap=_sp; + hw=(getWidth()/2); + hh=(getHeight()/2); + } + void drawstroke(RPoint Sp,RPoint Ep) { + drawstroke(Sp,Ep,col); + } + void drawstroke(RPoint Sp,RPoint Ep,color _col) { + noFill(); + stroke(red(_col),green(_col),blue(_col),255); + strokeWeight(linewidth); + RPoint L0=smap.per(Sp,4); + RPoint L1=smap.per(Ep,4); + line(L0.x+hw,L0.y+hh,L1.x+hw,L1.y+hh); + } +} + + +class gradientstroke3D extends line3D { + float startsize,endsize,mpfract,raisefract,bezierfract; + float[] transpos; + float[] transamt; gradientstroke3D(float _s,float _e,float[] _p, float[] _a,color _c,sphereMap _sp){ + super(1.0,_c,_sp); startsize=_s; endsize=_e; transpos=_p; transamt=_a; - col=_c; - smap=_sp; - hw=(getWidth()/2); - hh=(getHeight()/2); + } void drawstroke(RPoint Sp,RPoint Ep) { drawstroke(Sp,Ep,col); @@ -190,33 +311,60 @@ class gradientstroke3D { } } } - } -class linear3D { - float linewidth; - color col; - sphereMap smap; - float hw,hh; - linear3D(float _l,color _c,sphereMap _sp){ - linewidth=_l; - col=_c; - smap=_sp; - hw=(getWidth()/2); - hh=(getHeight()/2); +class greatcirclestroke3D extends line3D { + //draws a stroke with variable transparency that follows the great circle between two latlng + //doesn't look right + float[] transpos; + float[] transamt; + greatcirclestroke3D(float _l,float[] _p, float[] _a,color _c,sphereMap _sp){ + super(_l,_c,_sp); + transpos=_p; + transamt=_a; } void drawstroke(RPoint Sp,RPoint Ep) { drawstroke(Sp,Ep,col); } void drawstroke(RPoint Sp,RPoint Ep,color _col) { + noFill(); - stroke(red(_col),green(_col),blue(_col),255); strokeWeight(linewidth); - RPoint L0=smap.per(Sp,4); - RPoint L1=smap.per(Ep,4); - line(L0.x+hw,L0.y+hh,L1.x+hw,L1.y+hh); + float spos=0.0; + float step=0.01; //optimise + + RPoint L0,L1; + L0=Sp; + int iteration=0; + for (int i=0;i<transpos.length-1;i++) { + float transeg=transpos[i+1]-transpos[i]; + for (float u=0;u<transeg-step;u+=step) { + float gradamt=u/transeg; + float b=255.0*((transamt[i]*(1-gradamt))+(transamt[i+1]*gradamt)); + + //find new point on line + L1=smap.per(GCircFract(Sp,Ep,transpos[i]+u),4); //+(sin((transpos[i]+u)*PI)*0.1)); + //L1=smap.per(new RPoint(lerp(Sp.x,Ep.x,transpos[i]+u),lerp(Sp.y,Ep.y,transpos[i]+u)),4+(sin((transpos[i]+u)*PI)*0.1)); + //float lw=lerp(startsize,endsize,transpos[i]+u)/2; + if (iteration>1) { + stroke(red(_col),green(_col),blue(_col),b); + line(L0.x+hw,L0.y+hh,L1.x+hw,L1.y+hh); + } + iteration++; + L0=L1; + + /* + //temporarily draw line in 2D + strokeWeight(((1-(transpos[i]+u))*startsize)+((transpos[i]+u)*endsize)); + stroke(red(col),green(col),blue(col),b); + line(lerp(Sp.x,Ep.x,transpos[i]+u),lerp(Sp.y,Ep.y,transpos[i]+u),; + */ + + + } + } } - } + |
