Further optimisation of d3.layout.pack.

Also avoids floating point errors without clamping, hopefully.
This commit is contained in:
Jason Davies 2012-07-25 13:46:20 +01:00
Родитель 7c28977420
Коммит 9b3e780006
4 изменённых файлов: 16 добавлений и 16 удалений

10
d3.v2.js поставляемый
Просмотреть файл

@ -6283,11 +6283,11 @@ function d3_layout_packPlace(a, b, c) {
dy = b.y - a.y;
if (db && (dx || dy)) {
var da = b.r + c.r,
dc2 = dx * dx + dy * dy,
dc = Math.sqrt(dc2),
cos = (db * db + dc2 - da * da) / (2 * db * dc),
x = cos * (db /= dc),
y = Math.sqrt(Math.max(0, 1 - cos * cos)) * db;
dc = dx * dx + dy * dy;
da *= da;
db *= db;
var x = (db + dc - da) / (2 * dc),
y = Math.sqrt(2 * da * (db + dc) - (db - dc) * (db - dc) - da * da) / (2 * dc);
c.x = a.x + x * dx + y * dy;
c.y = a.y + x * dy - y * dx;
} else {

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

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

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

@ -181,11 +181,11 @@ function d3_layout_packPlace(a, b, c) {
dy = b.y - a.y;
if (db && (dx || dy)) {
var da = b.r + c.r,
dc2 = dx * dx + dy * dy,
dc = Math.sqrt(dc2),
cos = (db * db + dc2 - da * da) / (2 * db * dc),
x = cos * (db /= dc),
y = Math.sqrt(Math.max(0, 1 - cos * cos)) * db;
dc = dx * dx + dy * dy;
da *= da;
db *= db;
var x = (db + dc - da) / (2 * dc),
y = Math.sqrt(2 * da * (db + dc) - (db - dc) * (db - dc) - da * da) / (2 * dc);
c.x = a.x + x * dx + y * dy;
c.y = a.y + x * dy - y * dx;
} else {

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

@ -33,7 +33,7 @@ suite.addBatch({
{y: 0.5084543199854831, x: 0.4682608366855136, value: 0.01, r: 0.016411496513964046, depth: 1},
{y: 0.5084543199854831, x: 0.7167659426883449, value: 2, r: 0.23209360948886723, depth: 1},
{y: 0.34256315498862167, x: 0.2832340573116551, value: 2, r: 0.23209360948886723, depth: 1},
{y: 0.7254154893606051, x: 0.3852405506102519, value: 1, r: 0.16411496513964044, depth: 1}
{y: 0.7254154893606051, x: 0.38524055061025186, value: 1, r: 0.16411496513964044, depth: 1}
]);
assert.deepEqual(d3.layout.pack().sort(null).nodes({children: [
{value: 2},
@ -45,7 +45,7 @@ suite.addBatch({
{y: 0.6274712284943809, x: 0.26624891409386664, value: 2, r: 0.23375108590613333, depth: 1},
{y: 0.6274712284943809, x: 0.7337510859061334, value: 2, r: 0.23375108590613333, depth: 1},
{y: 0.30406466355343187, x: 0.5, value: 1, r: 0.1652869779539461, depth: 1},
{y: 0.3878967195987758, x: 0.3386645534068855, value: 0.01, r: 0.01652869779539461, depth: 1}
{y: 0.3878967195987758, x: 0.3386645534068854, value: 0.01, r: 0.01652869779539461, depth: 1}
]);
},
"can handle residual floating point error": function(pack) {