Kinetic.Isometric = function(tw,th,mw,mh){
   
    this._tile.width = parseInt(tw);
    this._tile.height = parseInt(th)||parseInt(tw)/2;
    this._tile.r = this._tile.width / this._tile.height;
            
    this._map.width = parseInt(mw);
    this._map.height = parseInt(mh) || parseInt(mw);
       
    this._origin.x = this._map.height * this._tile.width / 2;
    this._width =  this._map.height * this._tile.width;
    this._height = this._map.height * this._tile.height;
            
         
    return this;
}
   
Kinetic.Isometric.prototype ={
    _tile :{
        width:0,
        height:0,
        r:0
    },
    _map:{
        width:0,
        height:0
    },
    _origin:{
        x:0,
        y:0
    },
 
    pos2px:function(x,y){
 
        return{
            left:~~((x-y)*this._tile.width/2+this._origin.x),
            top:~~((x+y)*this._tile.height/2)
        }
    },
    px2pos:function(left,top){
        var x = (left - this._origin.x)/this._tile.r;
        return {
            x:((top+x) / this._tile.height),
            y:((top-x) / this._tile.height)
        }
    },
    getCenterPosition:function(x,y,width,height){
        var pos = this.pos2px(x,y),
        newX = -pos.left+width/2-this._tile.width/2,
        newY = -pos.top+height/2;
        return {
            x:~~newX,
            y:~~newY
            };
    },
    area:function(vp,offset,torus){
        if(!offset) offset = 0;
        if(!torus) torus = true;
        
        
        var start = {
            x:vp.x-this._tile.width/2,
            y:vp.y+this._tile.height
        };
        var end = {
            x:start.x+vp.w,
            y:start.y+vp.h
        }
        var grid = [];
        for(var y = start.y,yl =end.y;y<=yl;y+=this._tile.height/2){
            for(var x = start.x,xl =end.x;x<=xl;x+=this._tile.width/2){
               
                var row = this.px2pos(x,y),
                posX = ~~row.x,posY = ~~row.y;
          
                if(!torus && posX > 0 || posY > 0) {
                    posX = Math.max(0, Math.min(this._map.width, posX));
                    posY = Math.max(0, Math.min(this._map.height, posY));
                    grid.push([posX,posY]); 
                }else{
                    grid.push([posX,posY]);  
                }
              
            }
        }
      
      
        return grid;       
    } 
    
};
 
  |