Fix loss of significance for d3.geom.polygon.area.
This commit is contained in:
Родитель
1cc0fe8292
Коммит
915f044b8f
|
@ -6485,12 +6485,11 @@
|
||||||
}
|
}
|
||||||
d3.geom.polygon = function(coordinates) {
|
d3.geom.polygon = function(coordinates) {
|
||||||
coordinates.area = function() {
|
coordinates.area = function() {
|
||||||
var i = 0, n = coordinates.length, a = coordinates[n - 1][0] * coordinates[0][1], b = coordinates[n - 1][1] * coordinates[0][0];
|
var i = 0, n = coordinates.length, area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
|
||||||
while (++i < n) {
|
while (++i < n) {
|
||||||
a += coordinates[i - 1][0] * coordinates[i][1];
|
area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
|
||||||
b += coordinates[i - 1][1] * coordinates[i][0];
|
|
||||||
}
|
}
|
||||||
return (b - a) * .5;
|
return area * .5;
|
||||||
};
|
};
|
||||||
coordinates.centroid = function(k) {
|
coordinates.centroid = function(k) {
|
||||||
var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c;
|
var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c;
|
||||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -3,13 +3,11 @@ d3.geom.polygon = function(coordinates) {
|
||||||
coordinates.area = function() {
|
coordinates.area = function() {
|
||||||
var i = 0,
|
var i = 0,
|
||||||
n = coordinates.length,
|
n = coordinates.length,
|
||||||
a = coordinates[n - 1][0] * coordinates[0][1],
|
area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
|
||||||
b = coordinates[n - 1][1] * coordinates[0][0];
|
|
||||||
while (++i < n) {
|
while (++i < n) {
|
||||||
a += coordinates[i - 1][0] * coordinates[i][1];
|
area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
|
||||||
b += coordinates[i - 1][1] * coordinates[i][0];
|
|
||||||
}
|
}
|
||||||
return (b - a) * .5;
|
return area * .5;
|
||||||
};
|
};
|
||||||
|
|
||||||
coordinates.centroid = function(k) {
|
coordinates.centroid = function(k) {
|
||||||
|
|
|
@ -75,7 +75,21 @@ suite.addBatch({
|
||||||
assert.inDelta(centroid[0], 2, 1e-6);
|
assert.inDelta(centroid[0], 2, 1e-6);
|
||||||
assert.inDelta(centroid[1], 2, 1e-6);
|
assert.inDelta(centroid[1], 2, 1e-6);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"large square": {
|
||||||
|
topic: function() {
|
||||||
|
var r = 1e8,
|
||||||
|
d = d3.range(0, r, r / 1e4);
|
||||||
|
return d3.geom.polygon(
|
||||||
|
d.map(function(y) { return [0, y]; }).concat(
|
||||||
|
d.map(function(x) { return [x, r]; })).concat(
|
||||||
|
d.map(function(y) { return [r, y]; }).reverse()).concat(
|
||||||
|
d.map(function(x) { return [x, 0]; }).reverse()));
|
||||||
|
},
|
||||||
|
"has area 1e16 - 5e7": function(polygon) {
|
||||||
|
assert.equal(polygon.area(), 1e16 - 5e7);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
suite.export(module);
|
suite.export(module);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче