integ/js/vs/_vs.chart.circlelayout.js
changeset 28 84719280c84d
child 53 88666afffe6b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/integ/js/vs/_vs.chart.circlelayout.js	Fri Apr 12 15:08:00 2013 +0200
@@ -0,0 +1,331 @@
+(function ($) {
+
+$.fn._vs.chart.CircleLayout = function(_this,fn,options) {
+
+  var mouseJointTest;
+  var csX;
+  var csY;
+  var treeLayout;
+  var initValue  = []; // Initiation des valeurs
+  var tdv        = 0;  // Incoming point
+  var _this;
+
+  this.init = function (_this,options){
+    console.log('Circle Layout Init')
+    this._this              = _this
+    gravity                 = new _this.phy.b2Vec2(0, 0);    // Zero gravity
+    _this.world.m_gravity   = gravity;
+    _this.chartPhySetup     = {grounds:[],wall:[]}
+    this.treeLayout         = _this.settings.chart.treeLayout;
+
+            for (var i=0; i<_this.settings.data.model.length; i++) {
+            _this.settings.data.strata[i][0].value = _this.settings.data.strata[i][0].initValue;
+            }
+
+    // process data distribution to form layout
+    for (var i = 0; i <_this.settings.data.model.length; i++) { 
+      //console.log("-->",_this.settings.data.model[i])
+      _this.settings.data.model[i].value=0
+      for (var j = 0; j <_this.settings.data.strata[i].length; j++) { 
+         //console.log("-->",_this.settings.data.strata[i][j].value)
+        _this.settings.data.model[i].value += _this.settings.data.strata[i][j].value
+      }
+      //console.log("-->",_this.settings.data.model[i].value)
+      initValue.push(_this.settings.data.model[i].value)
+      tdv += _this.settings.data.model[i].value
+    }
+
+    if(this.treeLayout){
+      console.log("ici")
+     this.setupBubbleChartPhysics(_this);
+    }else{
+     this.setupPieChartPhysics(_this);
+    }
+   
+  };
+
+  this.setupPieChartPhysics = function(_this){
+
+    console.log("w",_this.settings.width)
+    // Pivot drawing
+    var radius = _this.settings.chart.radius
+        csX    = _this.settings.chart.width/2+_this.settings.chart.x
+        csY    = _this.settings.chart.height/2+_this.settings.chart.y
+    var axis   = pivot(csX,csY,radius, _this.settings.chart.wallColor);
+  
+    //targets
+    for (var i = 0;  i< _this.settings.data.model.length; i++) {
+      _this.settings.sedimentation.incoming.target[i] = {x:csX,y:csY};
+    }
+
+    // Separation 
+    var wall   = []
+    var spacer = _this.settings.chart.spacer;
+  
+    // Incoming point
+    var p      = 0;
+
+    console.log("tdv",tdv)
+
+    if (tdv==0){
+      for (var i = 0; i <_this.settings.data.length; i++) { 
+        initValue[i] = 1;
+      }
+      tdv = initValue.length
+    }
+
+    for (var i = 0; i <initValue.length; i++) { 
+       v = initValue[i]
+       a2 = ((v/2+p)/tdv)*360-90
+       p += v
+       a = (p/tdv)*360-90
+       c = circularCoordinate(a2,radius*5,csX,csY)
+
+    // incomming point setup 
+       console.log(c)
+      _this.settings.sedimentation.incoming.point[i] = c 
+    
+    // Bounds Wall drawing
+    _this.chartPhySetup.grounds[i]= this.createBox(
+                  _this,
+                  csX,
+                  csY,
+                  spacer,
+                  radius,
+                  a,
+                  radius,
+                  'wall',
+                  _this.settings.chart.wallColor);
+    }
+    console.log("w",_this.settings.chart.width)
+
+  };
+
+  this.update = function(_this,options){
+    console.log("update")
+    var defaultOptions = {cat:0,r:0}
+    options.r-=90
+    var angle          = (options.r+90)*(Math.PI/180)
+
+    var c              = circularCoordinate(options.r,
+                                    _this.settings.chart.radius,
+                                    _this.settings.chart.width/2+_this.settings.chart.x,
+                                    _this.settings.chart.height/2+_this.settings.chart.y)
+   
+    if(_this.chartPhySetup.grounds[options.cat]!=null) {
+      var myBody = _this.chartPhySetup.grounds[options.cat].GetBody();
+      var myPos  = myBody.GetWorldCenter();
+      var myAngle= myBody.GetAngle()
+      //console.log(myAngle)
+      myPos.y    = c.y/ _this.settings.options.scale
+      myPos.x    = c.x/ _this.settings.options.scale
+      myAngle    = angle
+      myBody.SetPosition(myPos);
+      myBody.SetAngle(myAngle);      
+      //console.log(myBody)
+    }
+  }
+
+  // default token for stream 
+  this.token = function (_this,options){
+    var i = options;
+    //console.log(options)
+    var token = {
+              x:(_this.settings.sedimentation.incoming.point[i].x+(Math.random()*2)),
+              y:(_this.settings.sedimentation.incoming.point[i].y+(Math.random()*1)),
+              t:_this.now(),
+              size:_this.settings.sedimentation.token.size.original,
+              category:i,
+              phy:{
+                  density:10,
+                  friction:0,
+                  restitution:0
+              },
+              targets:[{
+                  //  bizare x/2 or x ...
+                  x: _this.settings.sedimentation.incoming.target[i].x,
+                  y: _this.settings.sedimentation.incoming.target[i].y
+              }]
+            }
+    return token; 
+  }
+
+  function circularCoordinate(degree,radius,posX,posY){
+      j = degree*Math.PI/180
+      var x = (Math.cos(j) * radius)+posX;
+      var y = (Math.sin(j) * radius)+posY;
+      var c = {x:x,y:y}
+      return c
+  }
+
+  function pivot (centerSceneX,centerSceneY,radius,color){
+    var scale           = _this.settings.options.scale
+    var fixDef          = new _this.phy.b2FixtureDef;
+
+    fixDef.density      = 1.0;
+    fixDef.friction     = 0.5;
+    fixDef.restitution  = 0.2;
+    var bodyDef         = new _this.phy.b2BodyDef;
+    fixDef.shape        = new _this.phy.b2CircleShape(radius/scale);
+    bodyDef.position.Set(centerSceneX/scale, centerSceneY/scale);
+
+    var axis            = _this.world.CreateBody(bodyDef).CreateFixture(fixDef);
+    axis.m_userData     = {type:"wall",familyID:null,fillStyle:color,strokeStyle:color,r:radius}
+    return  axis;
+  }
+
+  this.createBox = function (_this,x,y,w,h,a,r,type,color){
+     var scale          = _this.settings.options.scale
+     var fixDef         = new _this.phy.b2FixtureDef;
+     var c              = circularCoordinate(a,r,x,y)
+
+     fixDef.density     = 1.0;
+     fixDef.friction    = 0.5;
+     fixDef.restitution = 0.2;
+     
+     var bodyDef        = new _this.phy.b2BodyDef;
+     var angle          = (a+90)*(Math.PI/180)
+     bodyDef.angle      = angle;//a+80 ;
+     //create ground
+     bodyDef.type       = _this.phy.b2Body.b2_staticBody;
+     fixDef.shape       = new _this.phy.b2PolygonShape;
+     fixDef.shape.SetAsBox(w/scale, h/scale);
+     bodyDef.position.Set(c.x/scale,c.y/scale );
+     var box = _this.world.CreateBody(bodyDef).CreateFixture(fixDef);
+     box.m_userData = {type:type,fillStyle:color,w:w,h:h,r:r}
+     //console.log(box)
+     return box
+  }
+
+  this.getPosition = function(_this){
+    var result =[]
+    for (var i = 0; i < _this.chartPhySetup.grounds.length; i++) {
+      myElement = _this.chartPhySetup.grounds[i]
+      myBody    = myElement.GetBody();
+      //console.log(myBody.GetAngle())
+      result.push({
+        x:(myBody.GetWorldCenter().x* _this.settings.options.scale),
+        y:(myBody.GetWorldCenter().y* _this.settings.options.scale),
+        a:myBody.GetAngle(),
+        w:myElement.m_userData.w,
+        h:myElement.m_userData.h,
+        r:myElement.m_userData.r,
+      })
+    };  
+   return result 
+  }
+
+
+//  --------- --------- --------- --------- --------- --------- ---------
+// Bubble ---------
+  this.setupBubbleChartPhysics= function(_this){
+    console.log("setupBubbleChartPhysics")
+
+    var colSize = ( _this.settings.chart.width/ _this.settings.data.model.length)
+    var colBwid = _this.settings.chart.spacer
+    var colYpos = _this.settings.chart.height/2+_this.settings.y+colBwid
+    var Ypos    = 0;//chart.position.y;
+    var Xpos    = 0;//chart.position.x;
+    var NumCol  = _this.settings.chart.column;
+   // console.log(Xpos)
+   // console.log( _this.settings.width)
+
+  // array layout
+  for( var i = 0 ; i<_this.settings.data.model.length; i++) {
+      
+      Xpos =  _this.settings.chart.x+(i%NumCol*colBwid)+(colBwid/2)
+      Ypos =  _this.settings.chart.y+Math.floor(i/NumCol)*colBwid+(colBwid/2)
+      //console.log("- "+i+" x:"+Xpos+" y:"+Ypos);
+      _this.settings.sedimentation.incoming.target[i] = {x:Xpos,y:Ypos};
+      
+      pivot[i] = creatMyBubblePivot(Xpos,
+                                    Ypos,
+                                    _this.settings.chart.spacer,
+                                    i);
+
+      _this.settings.data.model[i].incomingPoint = {
+                                     x:Xpos,
+                                     y:Ypos
+                                   };
+      
+    }
+
+  }
+function creatMyBubblePivot(Xpos,Ypos,radius,id){
+   console.log("CreatMyBubblePivot",Xpos,Ypos,radius,id)
+   
+   var scale          = _this.settings.options.scale
+   var fixDef         = new _this.phy.b2FixtureDef;
+   var colorRange     = d3.scale.category10()
+
+    fixDef.density    = 10000;
+    fixDef.friction   = 0.0;
+    fixDef.restitution= 0.0;
+
+   var bodyDef        = new _this.phy.b2BodyDef;
+   fixDef.shape       = new _this.phy.b2CircleShape(radius*scale);
+   bodyDef.position.Set(Xpos/scale, Ypos/scale);
+
+   var axis           = _this.world.CreateBody( bodyDef);
+   var axisf          = axis.CreateFixture(fixDef);
+
+   console.log(id,colorRange(id))
+   axisf.m_userData   = {
+                         type:"BubblePivot",
+                         familyID:id,
+                         fillStyle:_this.settings.chart.wallColor
+                        }
+   console.log(id,axisf)
+
+   axisf.m_shape.m_radius = _this.settings.data.model[id].value/scale;
+   //console.log(Xpos,Ypos)
+   return axisf;
+}
+
+this.getPivotPosition =function (id){
+  
+  //console.log(_this.settings.data.model)
+
+  if(typeof(id)!="undefined"){
+    return this.pivot
+  } else{
+    var result=[];
+      for( var i = 0 ; i<_this.settings.data.model.length; i++) {
+        result.push(_this.settings.data.model[i])
+    }
+    return result
+  }
+}
+
+function updatePivotFixPosition(x,y,id){
+    var myBody        = pivot[id].GetBody();
+    myBody.SetPosition(new b2Vec2(x/scale, y/scale));
+    _this.settings.data.model[id].incomingPoint.x=x;
+    _this.settings.data.model[id].incomingPoint.y=y;
+    setFlowSpeed(speedFlow);
+
+}
+function setPivotPosition(x,y,id){
+    for( var i = 0 ; i<categorys[id].joins.length; i++) {
+      categorys[id].joins[i].SetTarget(new b2Vec2(x/scale, y/scale));
+    }
+}
+function setPivotRadius(r,id){
+    //nBodies[b].m_shape.m_radius
+    pivot[id].m_shape.m_radius=r;
+}
+
+
+// Bubble ---------
+//  --------- --------- --------- --------- --------- --------- ---------
+  if (typeof(fn)!=undefined){
+    var result = this[fn](_this,options);
+    if (typeof(result)!=undefined){
+      return result
+    }
+  }
+  
+}
+
+
+})(jQuery);