alcatel/static/js/treemap.js.old
author obledc
Tue, 10 Sep 2013 13:28:30 +0200
changeset 44 3648b6dea2cc
parent 40 de926fe6c241
permissions -rw-r--r--
new
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
obledc
parents:
diff changeset
     1
/* Génération de données aléatoires */
obledc
parents:
diff changeset
     2
obledc
parents:
diff changeset
     3
var data = [],
obledc
parents:
diff changeset
     4
    startcolor = [ 0, 0, 255 ],
obledc
parents:
diff changeset
     5
    endcolor = [ 255, 255, 0 ]
obledc
parents:
diff changeset
     6
    elementcount = 8;
obledc
parents:
diff changeset
     7
obledc
parents:
diff changeset
     8
for (var i = 0; i < elementcount; i++) {
obledc
parents:
diff changeset
     9
    var r = i/elementcount,
obledc
parents:
diff changeset
    10
        col = _(endcolor).map(function(e,i) {
obledc
parents:
diff changeset
    11
            var s = startcolor[i]
obledc
parents:
diff changeset
    12
            return Math.floor(r*e + (1-r)*s)
obledc
parents:
diff changeset
    13
        });
obledc
parents:
diff changeset
    14
    data.push({
obledc
parents:
diff changeset
    15
        label: "Cluster " + (1+i),
obledc
parents:
diff changeset
    16
        i: i+1,
obledc
parents:
diff changeset
    17
        color: "rgb("+col.join(",")+")",
obledc
parents:
diff changeset
    18
        value: 1+Math.pow(Math.random(),2)*5
obledc
parents:
diff changeset
    19
    });
obledc
parents:
diff changeset
    20
}
obledc
parents:
diff changeset
    21
obledc
parents:
diff changeset
    22
/* Génération du Treemap */
obledc
parents:
diff changeset
    23
obledc
parents:
diff changeset
    24
data = _(data).sortBy(function(d) { return -d.value; });
obledc
parents:
diff changeset
    25
obledc
parents:
diff changeset
    26
var IDEALRATIO = 1.25;
obledc
parents:
diff changeset
    27
obledc
parents:
diff changeset
    28
function cuttree(data, x, y, w, h, cut, ratio, callback) {
obledc
parents:
diff changeset
    29
    
obledc
parents:
diff changeset
    30
    function f(subdata, subx, suby, subw, subh) {
obledc
parents:
diff changeset
    31
        if (subdata.length == 1) {
obledc
parents:
diff changeset
    32
            subdata[0].x = subx;
obledc
parents:
diff changeset
    33
            subdata[0].y = suby;
obledc
parents:
diff changeset
    34
            subdata[0].w = subw;
obledc
parents:
diff changeset
    35
            subdata[0].h = subh;
obledc
parents:
diff changeset
    36
        } else {
obledc
parents:
diff changeset
    37
            callback(subdata, subx, suby, subw, subh)
obledc
parents:
diff changeset
    38
        }
obledc
parents:
diff changeset
    39
    }
obledc
parents:
diff changeset
    40
    
obledc
parents:
diff changeset
    41
    var first = _(data).first(cut), rest = _(data).rest(cut);
obledc
parents:
diff changeset
    42
    if (!first.length || !rest.length) {
obledc
parents:
diff changeset
    43
        return;
obledc
parents:
diff changeset
    44
    }
obledc
parents:
diff changeset
    45
    if (w/h > IDEALRATIO) {
obledc
parents:
diff changeset
    46
        var leftw = w * ratio;
obledc
parents:
diff changeset
    47
        f(first, x, y, leftw, h);
obledc
parents:
diff changeset
    48
        f(rest, x + leftw, y, w - leftw, h);
obledc
parents:
diff changeset
    49
    } else {
obledc
parents:
diff changeset
    50
        var toph = h * ratio;
obledc
parents:
diff changeset
    51
        f(first, x, y, w, toph);
obledc
parents:
diff changeset
    52
        f(rest, x, y + toph, w, h - toph);
obledc
parents:
diff changeset
    53
    }
obledc
parents:
diff changeset
    54
}
obledc
parents:
diff changeset
    55
obledc
parents:
diff changeset
    56
function pivot(data, x, y, w, h) {
obledc
parents:
diff changeset
    57
    var cut = 1, cumul = 0, bestcumul = 0, total = _(data).reduce(function(a,b){return a+b.value},0), bestcut = Infinity;
obledc
parents:
diff changeset
    58
    for (var i = 0; i < data.length - 1; i++) {
obledc
parents:
diff changeset
    59
        cumul += data[i].value;
obledc
parents:
diff changeset
    60
        var delta = Math.abs(cumul - total/2);
obledc
parents:
diff changeset
    61
        if (delta < bestcut) {
obledc
parents:
diff changeset
    62
            bestcut = delta;
obledc
parents:
diff changeset
    63
            bestcumul = cumul;
obledc
parents:
diff changeset
    64
            cut = i+1;
obledc
parents:
diff changeset
    65
        } else {
obledc
parents:
diff changeset
    66
            break;
obledc
parents:
diff changeset
    67
        }
obledc
parents:
diff changeset
    68
    }
obledc
parents:
diff changeset
    69
    cuttree(data, x, y, w, h, cut, bestcumul / total, pivot);
obledc
parents:
diff changeset
    70
}
obledc
parents:
diff changeset
    71
obledc
parents:
diff changeset
    72
function squarify(data, x, y, w, h) {
obledc
parents:
diff changeset
    73
    var cut = 1, cumul = 0, bestcumul = 0, total = _(data).reduce(function(a,b){return a+b.value},0), bestcut = Infinity;
obledc
parents:
diff changeset
    74
    for (var i = 0; i < data.length - 1; i++) {
obledc
parents:
diff changeset
    75
        cumul += data[i].value;
obledc
parents:
diff changeset
    76
        cuttree(data, x, y, w, h, i+1, cumul / total, pivot);
obledc
parents:
diff changeset
    77
        var ratio = Math.abs(Math.log(IDEALRATIO*data[0].h/data[0].w));
obledc
parents:
diff changeset
    78
        if (ratio < bestcut) {
obledc
parents:
diff changeset
    79
            bestcut = ratio;
obledc
parents:
diff changeset
    80
            bestcumul = cumul;
obledc
parents:
diff changeset
    81
            cut = i+1;
obledc
parents:
diff changeset
    82
        } else {
obledc
parents:
diff changeset
    83
            break;
obledc
parents:
diff changeset
    84
        }
obledc
parents:
diff changeset
    85
    }
obledc
parents:
diff changeset
    86
    cuttree(data, x, y, w, h, cut, bestcumul / total, squarify);
obledc
parents:
diff changeset
    87
}
obledc
parents:
diff changeset
    88
obledc
parents:
diff changeset
    89
/* Template des éléments à insérer */
obledc
parents:
diff changeset
    90
var actu = 
obledc
parents:
diff changeset
    91
    '<div class="actu" style="left: <%=x%>px; top: <%=y%>px; width: <%=w%>px; height: <%=h%>px; background: <%=color%>">'+
obledc
parents:
diff changeset
    92
        '<a href="#">'+
obledc
parents:
diff changeset
    93
            '<img src="img/home-visuel-<%-i%>.jpg" alt="" />'+
obledc
parents:
diff changeset
    94
        '</a>'+
obledc
parents:
diff changeset
    95
        '<div class="inner-actu">'+
obledc
parents:
diff changeset
    96
            '<h2><a href="#"><%-label%></a></h2>'+
obledc
parents:
diff changeset
    97
            '<div class="links">'+
obledc
parents:
diff changeset
    98
                '<ul>'+
obledc
parents:
diff changeset
    99
                    '<li><a href="#" title="Supprimer le cluster" class="trash"></a></li>'+
obledc
parents:
diff changeset
   100
                    '<li><a href="#" title="317 Annotations sur ce cluster" class="file"><span>317</span></a></li>'+
obledc
parents:
diff changeset
   101
                    '<li><a href="#" title="Ajouter une annotation au cluster" class="comment"></a></li>'+
obledc
parents:
diff changeset
   102
                '</ul>'+
obledc
parents:
diff changeset
   103
            '</div>'+
obledc
parents:
diff changeset
   104
        '</div>'+
obledc
parents:
diff changeset
   105
    '</div>';
obledc
parents:
diff changeset
   106
var tmpl = _.template(actu);
obledc
parents:
diff changeset
   107
obledc
parents:
diff changeset
   108
squarify(data,0,0,760,358);
obledc
parents:
diff changeset
   109
obledc
parents:
diff changeset
   110
document.getElementById('treemap1').innerHTML = _(data).reduce(function(mem, d) {
obledc
parents:
diff changeset
   111
    return mem + tmpl(d);
obledc
parents:
diff changeset
   112
},"");
obledc
parents:
diff changeset
   113
obledc
parents:
diff changeset
   114
//redimensionnement d'image
obledc
parents:
diff changeset
   115
$(".actu").each(function(k,v){
obledc
parents:
diff changeset
   116
    var wActu = $(this).width();
obledc
parents:
diff changeset
   117
    var hActu = $(this).height();
obledc
parents:
diff changeset
   118
    var img = $(this).find('img');
obledc
parents:
diff changeset
   119
    var wImg = img.width();
obledc
parents:
diff changeset
   120
    var hImg = img.height();
obledc
parents:
diff changeset
   121
obledc
parents:
diff changeset
   122
    var ratioImg = wImg/hImg;
obledc
parents:
diff changeset
   123
    img.css('height',hActu);
obledc
parents:
diff changeset
   124
    img.css('width',hActu*ratioImg);
obledc
parents:
diff changeset
   125
    wImg = img.width();
obledc
parents:
diff changeset
   126
    hImg = img.height();
obledc
parents:
diff changeset
   127
obledc
parents:
diff changeset
   128
    if(wActu>wImg){
obledc
parents:
diff changeset
   129
        var ratioImg = hImg/wImg;
obledc
parents:
diff changeset
   130
        img.css('width', wActu);
obledc
parents:
diff changeset
   131
        img.css('height',wActu*ratioImg);
obledc
parents:
diff changeset
   132
        wImg = img.width();
obledc
parents:
diff changeset
   133
        hImg = img.height();
obledc
parents:
diff changeset
   134
    }
obledc
parents:
diff changeset
   135
obledc
parents:
diff changeset
   136
    if (wImg<wActu) {
obledc
parents:
diff changeset
   137
        img.css('margin-left',(wActu-wImg)/2);
obledc
parents:
diff changeset
   138
    }else{
obledc
parents:
diff changeset
   139
        img.css('margin-left',-(wImg-wActu)/2);
obledc
parents:
diff changeset
   140
    }
obledc
parents:
diff changeset
   141
    if (hImg<hActu) {
obledc
parents:
diff changeset
   142
        img.css('margin-top',(hActu-hImg)/2);
obledc
parents:
diff changeset
   143
    }else{
obledc
parents:
diff changeset
   144
        img.css('margin-top',-(hImg-hActu)/2);
obledc
parents:
diff changeset
   145
    }
obledc
parents:
diff changeset
   146
});