| import {sqrt} from "../math.js"; |
|
|
| |
|
|
| var X0 = 0, |
| Y0 = 0, |
| Z0 = 0, |
| X1 = 0, |
| Y1 = 0, |
| Z1 = 0, |
| X2 = 0, |
| Y2 = 0, |
| Z2 = 0, |
| x00, |
| y00, |
| x0, |
| y0; |
|
|
| var centroidStream = { |
| point: centroidPoint, |
| lineStart: centroidLineStart, |
| lineEnd: centroidLineEnd, |
| polygonStart: function() { |
| centroidStream.lineStart = centroidRingStart; |
| centroidStream.lineEnd = centroidRingEnd; |
| }, |
| polygonEnd: function() { |
| centroidStream.point = centroidPoint; |
| centroidStream.lineStart = centroidLineStart; |
| centroidStream.lineEnd = centroidLineEnd; |
| }, |
| result: function() { |
| var centroid = Z2 ? [X2 / Z2, Y2 / Z2] |
| : Z1 ? [X1 / Z1, Y1 / Z1] |
| : Z0 ? [X0 / Z0, Y0 / Z0] |
| : [NaN, NaN]; |
| X0 = Y0 = Z0 = |
| X1 = Y1 = Z1 = |
| X2 = Y2 = Z2 = 0; |
| return centroid; |
| } |
| }; |
|
|
| function centroidPoint(x, y) { |
| X0 += x; |
| Y0 += y; |
| ++Z0; |
| } |
|
|
| function centroidLineStart() { |
| centroidStream.point = centroidPointFirstLine; |
| } |
|
|
| function centroidPointFirstLine(x, y) { |
| centroidStream.point = centroidPointLine; |
| centroidPoint(x0 = x, y0 = y); |
| } |
|
|
| function centroidPointLine(x, y) { |
| var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy); |
| X1 += z * (x0 + x) / 2; |
| Y1 += z * (y0 + y) / 2; |
| Z1 += z; |
| centroidPoint(x0 = x, y0 = y); |
| } |
|
|
| function centroidLineEnd() { |
| centroidStream.point = centroidPoint; |
| } |
|
|
| function centroidRingStart() { |
| centroidStream.point = centroidPointFirstRing; |
| } |
|
|
| function centroidRingEnd() { |
| centroidPointRing(x00, y00); |
| } |
|
|
| function centroidPointFirstRing(x, y) { |
| centroidStream.point = centroidPointRing; |
| centroidPoint(x00 = x0 = x, y00 = y0 = y); |
| } |
|
|
| function centroidPointRing(x, y) { |
| var dx = x - x0, |
| dy = y - y0, |
| z = sqrt(dx * dx + dy * dy); |
|
|
| X1 += z * (x0 + x) / 2; |
| Y1 += z * (y0 + y) / 2; |
| Z1 += z; |
|
|
| z = y0 * x - x0 * y; |
| X2 += z * (x0 + x); |
| Y2 += z * (y0 + y); |
| Z2 += z * 3; |
| centroidPoint(x0 = x, y0 = y); |
| } |
|
|
| export default centroidStream; |
|
|