Skip to content

Commit 915f044

Browse files
committed
Fix loss of significance for d3.geom.polygon.area.
1 parent 1cc0fe8 commit 915f044

4 files changed

Lines changed: 22 additions & 11 deletions

File tree

d3.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6485,12 +6485,11 @@
64856485
}
64866486
d3.geom.polygon = function(coordinates) {
64876487
coordinates.area = function() {
6488-
var i = 0, n = coordinates.length, a = coordinates[n - 1][0] * coordinates[0][1], b = coordinates[n - 1][1] * coordinates[0][0];
6488+
var i = 0, n = coordinates.length, area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
64896489
while (++i < n) {
6490-
a += coordinates[i - 1][0] * coordinates[i][1];
6491-
b += coordinates[i - 1][1] * coordinates[i][0];
6490+
area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
64926491
}
6493-
return (b - a) * .5;
6492+
return area * .5;
64946493
};
64956494
coordinates.centroid = function(k) {
64966495
var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c;

d3.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/geom/polygon.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ d3.geom.polygon = function(coordinates) {
33
coordinates.area = function() {
44
var i = 0,
55
n = coordinates.length,
6-
a = coordinates[n - 1][0] * coordinates[0][1],
7-
b = coordinates[n - 1][1] * coordinates[0][0];
6+
area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
87
while (++i < n) {
9-
a += coordinates[i - 1][0] * coordinates[i][1];
10-
b += coordinates[i - 1][1] * coordinates[i][0];
8+
area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
119
}
12-
return (b - a) * .5;
10+
return area * .5;
1311
};
1412

1513
coordinates.centroid = function(k) {

test/geom/polygon-test.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,21 @@ suite.addBatch({
7575
assert.inDelta(centroid[0], 2, 1e-6);
7676
assert.inDelta(centroid[1], 2, 1e-6);
7777
}
78-
}
78+
},
79+
"large square": {
80+
topic: function() {
81+
var r = 1e8,
82+
d = d3.range(0, r, r / 1e4);
83+
return d3.geom.polygon(
84+
d.map(function(y) { return [0, y]; }).concat(
85+
d.map(function(x) { return [x, r]; })).concat(
86+
d.map(function(y) { return [r, y]; }).reverse()).concat(
87+
d.map(function(x) { return [x, 0]; }).reverse()));
88+
},
89+
"has area 1e16 - 5e7": function(polygon) {
90+
assert.equal(polygon.area(), 1e16 - 5e7);
91+
}
92+
},
7993
});
8094

8195
suite.export(module);

0 commit comments

Comments
 (0)