Fix negatively-sized rectangles in treemap.

Includes unit test!

Fixes #136.
This commit is contained in:
Jason Davies 2011-08-26 18:46:01 +01:00
Родитель fb7e69f75e
Коммит 04d2d546cf
4 изменённых файлов: 35 добавлений и 5 удалений

Просмотреть файл

@ -1754,7 +1754,7 @@ d3.layout.treemap = function() {
v = u ? round(row.area / u) : 0, v = u ? round(row.area / u) : 0,
o; o;
if (u == rect.dx) { // horizontal subdivision if (u == rect.dx) { // horizontal subdivision
if (flush || v > rect.dy) v = rect.dy; // over+underflow if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow
while (++i < n) { while (++i < n) {
o = row[i]; o = row[i];
o.x = x; o.x = x;
@ -1767,7 +1767,7 @@ d3.layout.treemap = function() {
rect.y += v; rect.y += v;
rect.dy -= v; rect.dy -= v;
} else { // vertical subdivision } else { // vertical subdivision
if (flush || v > rect.dx) v = rect.dx; // over+underflow if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow
while (++i < n) { while (++i < n) {
o = row[i]; o = row[i];
o.x = x; o.x = x;

2
d3.layout.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -106,7 +106,7 @@ d3.layout.treemap = function() {
v = u ? round(row.area / u) : 0, v = u ? round(row.area / u) : 0,
o; o;
if (u == rect.dx) { // horizontal subdivision if (u == rect.dx) { // horizontal subdivision
if (flush || v > rect.dy) v = rect.dy; // over+underflow if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow
while (++i < n) { while (++i < n) {
o = row[i]; o = row[i];
o.x = x; o.x = x;
@ -119,7 +119,7 @@ d3.layout.treemap = function() {
rect.y += v; rect.y += v;
rect.dy -= v; rect.dy -= v;
} else { // vertical subdivision } else { // vertical subdivision
if (flush || v > rect.dx) v = rect.dx; // over+underflow if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow
while (++i < n) { while (++i < n) {
o = row[i]; o = row[i];
o.x = x; o.x = x;

Просмотреть файл

@ -134,6 +134,36 @@ suite.addBatch({
{x: 1, y: 556, dx: 599, dy: 277}, {x: 1, y: 556, dx: 599, dy: 277},
{x: 1, y: 1, dx: 599, dy: 555} {x: 1, y: 1, dx: 599, dy: 555}
]); ]);
},
"no negatively sized rectangles": function(treemap) {
var t = treemap().size([615, 500]).sort(function(a, b) { return a.value - b.value; }).padding(29),
nodes = t.nodes({"children": [
{"value": 1},
{"value": 9},
{"value": 3},
{"value": 15},
{"value": 44},
{"value": 28},
{"value": 32},
{"value": 41},
{"value": 50},
{"value": 60},
{"value": 64},
{"value": 75},
{"value": 76},
{"value": 84},
{"value": 88},
{"value": 100},
{"value": 140},
{"value": 142},
{"value": 363},
{"value": 657},
{"value": 670},
{"value": 822},
{"value": 1173},
{"value": 1189}
]}).map(layout);
assert.equal(nodes.filter(function(n) { return n.dx < 0 || n.dy < 0; }).length, 0);
} }
} }
}); });