64 lines
1.2 KiB
JavaScript
64 lines
1.2 KiB
JavaScript
var Greedy = require('./greedy');
|
|
|
|
var MAX_TIMES = 20;
|
|
|
|
function spiralFill(label, greedy) {
|
|
var dt = -1;
|
|
var x = label.attr('x'),
|
|
y = label.attr('y');
|
|
var bbox = label.getBBox();
|
|
var maxDelta = Math.sqrt(bbox.width * bbox.width + bbox.height * bbox.height);
|
|
var dxdy,
|
|
t = -dt,
|
|
dx = 0,
|
|
dy = 0;
|
|
|
|
var f = function f(t) {
|
|
return [(t *= 0.1) * Math.cos(t), t * Math.sin(t)];
|
|
};
|
|
|
|
if (greedy.hasGap(bbox)) {
|
|
greedy.fillGap(bbox);
|
|
return true;
|
|
}
|
|
|
|
var canFill = false,
|
|
times = 0;
|
|
|
|
while (Math.min(Math.abs(dx), Math.abs(dy)) < maxDelta && times < MAX_TIMES) {
|
|
dxdy = f(t += dt);
|
|
dx = ~~dxdy[0];
|
|
dy = ~~dxdy[1];
|
|
label.attr({
|
|
x: x + dx,
|
|
y: y + dy
|
|
});
|
|
times++;
|
|
|
|
if (greedy.hasGap(label.getBBox())) {
|
|
greedy.fillGap(bbox);
|
|
canFill = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return canFill;
|
|
}
|
|
|
|
module.exports = function (labels) {
|
|
var label;
|
|
var greedy = new Greedy();
|
|
var toBeRemoved = [];
|
|
|
|
for (var i = 0; i < labels.length; i++) {
|
|
label = labels[i];
|
|
|
|
if (!spiralFill(label, greedy)) {
|
|
toBeRemoved.push(label);
|
|
}
|
|
}
|
|
|
|
for (var _i = 0; _i < toBeRemoved.length; _i++) {
|
|
toBeRemoved[_i].remove();
|
|
}
|
|
}; |