Skip to content

Commit 45d3a18

Browse files
committed
Default graticule step is now 10°. Better tests.
1 parent 1eeb8c0 commit 45d3a18

4 files changed

Lines changed: 155 additions & 58 deletions

File tree

d3.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6084,20 +6084,19 @@
60846084
return d3_geo_projection(d3_geo_gnomonic);
60856085
}).raw = d3_geo_gnomonic;
60866086
d3.geo.graticule = function() {
6087-
var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 22.5, dy = dx, DX = 90, DY = DX, x, y, X, Y, precision = 2.5;
6087+
var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
60886088
function graticule() {
60896089
return {
60906090
type: "MultiLineString",
60916091
coordinates: lines()
60926092
};
60936093
}
60946094
function lines() {
6095-
var xMajors = d3.range(Math.ceil(X0 / DX) * DX, X1, DX), xMinors = d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
6096-
return xMajors.indexOf(x) === -1;
6097-
}), yMajors = d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY), yMinors = d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
6098-
return yMajors.indexOf(y) === -1;
6099-
});
6100-
return xMajors.map(X).concat(yMajors.map(Y)).concat(xMinors.map(x)).concat(yMinors.map(y));
6095+
return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
6096+
return Math.abs(x % DX) > ε;
6097+
}).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
6098+
return Math.abs(y % DY) > ε;
6099+
}).map(y));
61016100
}
61026101
graticule.lines = function() {
61036102
return lines().map(function(coordinates) {
@@ -6114,7 +6113,7 @@
61146113
};
61156114
};
61166115
graticule.extent = function(_) {
6117-
if (!arguments.length) return graticule.majorExtent();
6116+
if (!arguments.length) return graticule.minorExtent();
61186117
return graticule.majorExtent(_).minorExtent(_);
61196118
};
61206119
graticule.majorExtent = function(_) {
@@ -6134,7 +6133,7 @@
61346133
return graticule.precision(precision);
61356134
};
61366135
graticule.step = function(_) {
6137-
if (!arguments.length) return graticule.majorStep();
6136+
if (!arguments.length) return graticule.minorStep();
61386137
return graticule.majorStep(_).minorStep(_);
61396138
};
61406139
graticule.majorStep = function(_) {

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/geo/graticule.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
d3.geo.graticule = function() {
22
var x1, x0, X1, X0,
33
y1, y0, Y1, Y0,
4-
dx = 22.5, dy = dx, DX = 90, DY = DX,
4+
dx = 10, dy = dx, DX = 90, DY = 360,
55
x, y, X, Y,
66
precision = 2.5;
77

@@ -10,11 +10,10 @@ d3.geo.graticule = function() {
1010
}
1111

1212
function lines() {
13-
var xMajors = d3.range(Math.ceil(X0 / DX) * DX, X1, DX),
14-
xMinors = d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return xMajors.indexOf(x) === -1; }),
15-
yMajors = d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY),
16-
yMinors = d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return yMajors.indexOf(y) === -1; });
17-
return xMajors.map(X).concat(yMajors.map(Y)).concat(xMinors.map(x)).concat(yMinors.map(y));
13+
return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X)
14+
.concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y))
15+
.concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return Math.abs(x % DX) > ε; }).map(x))
16+
.concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return Math.abs(y % DY) > ε; }).map(y));
1817
}
1918

2019
graticule.lines = function() {
@@ -34,7 +33,7 @@ d3.geo.graticule = function() {
3433
};
3534

3635
graticule.extent = function(_) {
37-
if (!arguments.length) return graticule.majorExtent();
36+
if (!arguments.length) return graticule.minorExtent();
3837
return graticule.majorExtent(_).minorExtent(_);
3938
};
4039

@@ -57,7 +56,7 @@ d3.geo.graticule = function() {
5756
};
5857

5958
graticule.step = function(_) {
60-
if (!arguments.length) return graticule.majorStep();
59+
if (!arguments.length) return graticule.minorStep();
6160
return graticule.majorStep(_).minorStep(_);
6261
};
6362

test/geo/graticule-test.js

Lines changed: 139 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,70 +9,141 @@ var ε = 1e-6;
99

1010
suite.addBatch({
1111
"graticule": {
12-
topic: function() {
13-
return d3.geo.graticule()
14-
.extent([[-90, -45], [90, 45]])
15-
.step([45, 45])
16-
.precision(3);
17-
},
1812

1913
"extent": {
20-
"defaults to just inside –180°, -90° to +180°, +90°": function() {
21-
assert.deepEqual(d3.geo.graticule().extent(), [[-180 + ε, -90 + ε], [180 - ε, 90 - ε]]);
14+
"sets minorExtent and majorExtent": function() {
15+
var graticule = d3.geo.graticule().extent([[-90, -45], [90, 45]]);
16+
assert.deepEqual(graticule.minorExtent(), [[-90, -45], [90, 45]]);
17+
assert.deepEqual(graticule.majorExtent(), [[-90, -45], [90, 45]]);
18+
},
19+
"gets minorExtent": function() {
20+
var graticule = d3.geo.graticule().minorExtent([[-90, -45], [90, 45]]);
21+
assert.deepEqual(graticule.extent(), [[-90, -45], [90, 45]]);
22+
}
23+
},
24+
25+
"majorExtent": {
26+
"default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function() {
27+
var extent = d3.geo.graticule().majorExtent();
28+
assert.equal(extent[0][0], -180);
29+
assert.equal(extent[1][0], +180);
30+
},
31+
"default latitude ranges from 90°S (exclusive) to 90°N (exclusive)": function() {
32+
var extent = d3.geo.graticule().majorExtent();
33+
assert.equal(extent[0][1], -90 + ε);
34+
assert.equal(extent[1][1], +90 - ε);
2235
},
2336
"coerces input values to numbers": function() {
24-
var graticule = d3.geo.graticule().extent([["-90", "-45"], ["+90", "+45"]]),
25-
extent = graticule.extent();
37+
var graticule = d3.geo.graticule().majorExtent([["-90", "-45"], ["+90", "+45"]]),
38+
extent = graticule.majorExtent();
2639
assert.strictEqual(extent[0][0], -90);
2740
assert.strictEqual(extent[0][1], -45);
2841
assert.strictEqual(extent[1][0], +90);
2942
assert.strictEqual(extent[1][1], +45);
3043
}
3144
},
3245

33-
"returns a MultiLineString": function(graticule) {
34-
assert.deepEqual(graticule(), {
35-
type: "MultiLineString",
36-
coordinates: [
37-
[[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45]],
38-
[[-45,-45],[-45,-42],[-45,-39],[-45,-36],[-45,-33],[-45,-30],[-45,-27],[-45,-24],[-45,-21],[-45,-18],[-45,-15],[-45,-12],[-45,-9],[-45,-6],[-45,-3],[-45,0],[-45,3],[-45,6],[-45,9],[-45,12],[-45,15],[-45,18],[-45,21],[-45,24],[-45,27],[-45,30],[-45,33],[-45,36],[-45,39],[-45,42],[-45,45]],
39-
[[0,-45],[0,-42],[0,-39],[0,-36],[0,-33],[0,-30],[0,-27],[0,-24],[0,-21],[0,-18],[0,-15],[0,-12],[0,-9],[0,-6],[0,-3],[0,0],[0,3],[0,6],[0,9],[0,12],[0,15],[0,18],[0,21],[0,24],[0,27],[0,30],[0,33],[0,36],[0,39],[0,42],[0,45]],
40-
[[45,-45],[45,-42],[45,-39],[45,-36],[45,-33],[45,-30],[45,-27],[45,-24],[45,-21],[45,-18],[45,-15],[45,-12],[45,-9],[45,-6],[45,-3],[45,0],[45,3],[45,6],[45,9],[45,12],[45,15],[45,18],[45,21],[45,24],[45,27],[45,30],[45,33],[45,36],[45,39],[45,42],[45,45]],
41-
[[-90,-45],[-87,-45],[-84,-45],[-81,-45],[-78,-45],[-75,-45],[-72,-45],[-69,-45],[-66,-45],[-63,-45],[-60,-45],[-57,-45],[-54,-45],[-51,-45],[-48,-45],[-45,-45],[-42,-45],[-39,-45],[-36,-45],[-33,-45],[-30,-45],[-27,-45],[-24,-45],[-21,-45],[-18,-45],[-15,-45],[-12,-45],[-9,-45],[-6,-45],[-3,-45],[0,-45],[3,-45],[6,-45],[9,-45],[12,-45],[15,-45],[18,-45],[21,-45],[24,-45],[27,-45],[30,-45],[33,-45],[36,-45],[39,-45],[42,-45],[45,-45],[48,-45],[51,-45],[54,-45],[57,-45],[60,-45],[63,-45],[66,-45],[69,-45],[72,-45],[75,-45],[78,-45],[81,-45],[84,-45],[87,-45],[90,-45]],
42-
[[-90,0],[-87,0],[-84,0],[-81,0],[-78,0],[-75,0],[-72,0],[-69,0],[-66,0],[-63,0],[-60,0],[-57,0],[-54,0],[-51,0],[-48,0],[-45,0],[-42,0],[-39,0],[-36,0],[-33,0],[-30,0],[-27,0],[-24,0],[-21,0],[-18,0],[-15,0],[-12,0],[-9,0],[-6,0],[-3,0],[0,0],[3,0],[6,0],[9,0],[12,0],[15,0],[18,0],[21,0],[24,0],[27,0],[30,0],[33,0],[36,0],[39,0],[42,0],[45,0],[48,0],[51,0],[54,0],[57,0],[60,0],[63,0],[66,0],[69,0],[72,0],[75,0],[78,0],[81,0],[84,0],[87,0],[90,0]]
43-
]
44-
});
46+
"minorExtent": {
47+
"default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function() {
48+
var extent = d3.geo.graticule().minorExtent();
49+
assert.equal(extent[0][0], -180);
50+
assert.equal(extent[1][0], +180);
51+
},
52+
"default latitude ranges from 80°S (inclusive) to 80°N (inclusive)": function() {
53+
var extent = d3.geo.graticule().minorExtent();
54+
assert.equal(extent[0][1], -80 - ε);
55+
assert.equal(extent[1][1], +80 + ε);
56+
},
57+
"coerces input values to numbers": function() {
58+
var graticule = d3.geo.graticule().minorExtent([["-90", "-45"], ["+90", "+45"]]),
59+
extent = graticule.minorExtent();
60+
assert.strictEqual(extent[0][0], -90);
61+
assert.strictEqual(extent[0][1], -45);
62+
assert.strictEqual(extent[1][0], +90);
63+
assert.strictEqual(extent[1][1], +45);
64+
}
4565
},
4666

4767
"step": {
48-
"defaults to 22.5°, 22.5°": function(graticule) {
49-
assert.deepEqual(d3.geo.graticule().step(), [22.5, 22.5]);
68+
"sets minorStep and majorStep": function() {
69+
var graticule = d3.geo.graticule().step([22.5, 22.5]);
70+
assert.deepEqual(graticule.minorStep(), [22.5, 22.5]);
71+
assert.deepEqual(graticule.majorStep(), [22.5, 22.5]);
72+
},
73+
"gets minorStep": function() {
74+
var graticule = d3.geo.graticule().minorStep([22.5, 22.5]);
75+
assert.deepEqual(graticule.step(), [22.5, 22.5]);
76+
}
77+
},
78+
79+
"minorStep": {
80+
"defaults to 10°, 10°": function() {
81+
assert.deepEqual(d3.geo.graticule().minorStep(), [10, 10]);
5082
},
5183
"coerces input values to numbers": function() {
52-
var graticule = d3.geo.graticule().step(["45", "11.25"]),
53-
step = graticule.step();
84+
var graticule = d3.geo.graticule().minorStep(["45", "11.25"]),
85+
step = graticule.minorStep();
5486
assert.strictEqual(step[0], 45);
5587
assert.strictEqual(step[1], 11.25);
5688
}
5789
},
5890

59-
"outline": {
60-
"returns a Polygon": function(graticule) {
61-
assert.deepEqual(graticule.outline(), {
62-
type: "Polygon",
63-
coordinates: [[
64-
[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45],
65-
[-87,45],[-84,45],[-81,45],[-78,45],[-75,45],[-72,45],[-69,45],[-66,45],[-63,45],[-60,45],[-57,45],[-54,45],[-51,45],[-48,45],[-45,45],[-42,45],[-39,45],[-36,45],[-33,45],[-30,45],[-27,45],[-24,45],[-21,45],[-18,45],[-15,45],[-12,45],[-9,45],[-6,45],[-3,45],[0,45],[3,45],[6,45],[9,45],[12,45],[15,45],[18,45],[21,45],[24,45],[27,45],[30,45],[33,45],[36,45],[39,45],[42,45],[45,45],[48,45],[51,45],[54,45],[57,45],[60,45],[63,45],[66,45],[69,45],[72,45],[75,45],[78,45],[81,45],[84,45],[87,45],[90,45],
66-
[90,42],[90,39],[90,36],[90,33],[90,30],[90,27],[90,24],[90,21],[90,18],[90,15],[90,12],[90,9],[90,6],[90,3],[90,0],[90,-3],[90,-6],[90,-9],[90,-12],[90,-15],[90,-18],[90,-21],[90,-24],[90,-27],[90,-30],[90,-33],[90,-36],[90,-39],[90,-42],[90,-45],
67-
[87,-45],[84,-45],[81,-45],[78,-45],[75,-45],[72,-45],[69,-45],[66,-45],[63,-45],[60,-45],[57,-45],[54,-45],[51,-45],[48,-45],[45,-45],[42,-45],[39,-45],[36,-45],[33,-45],[30,-45],[27,-45],[24,-45],[21,-45],[18,-45],[15,-45],[12,-45],[9,-45],[6,-45],[3,-45],[0,-45],[-3,-45],[-6,-45],[-9,-45],[-12,-45],[-15,-45],[-18,-45],[-21,-45],[-24,-45],[-27,-45],[-30,-45],[-33,-45],[-36,-45],[-39,-45],[-42,-45],[-45,-45],[-48,-45],[-51,-45],[-54,-45],[-57,-45],[-60,-45],[-63,-45],[-66,-45],[-69,-45],[-72,-45],[-75,-45],[-78,-45],[-81,-45],[-84,-45],[-87,-45],[-90,-45]
68-
]]
69-
});
91+
"majorStep": {
92+
"defaults to 90°, 360°": function() {
93+
assert.deepEqual(d3.geo.graticule().majorStep(), [90, 360]);
94+
},
95+
"coerces input values to numbers": function() {
96+
var graticule = d3.geo.graticule().majorStep(["45", "11.25"]),
97+
step = graticule.majorStep();
98+
assert.strictEqual(step[0], 45);
99+
assert.strictEqual(step[1], 11.25);
70100
}
71101
},
72102

73-
"line": {
74-
"returns an array of LineStrings": function(graticule) {
75-
assert.deepEqual(graticule.lines(), [
103+
"lines": {
104+
"default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function() {
105+
var lines = d3.geo.graticule().lines()
106+
.filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; })
107+
.sort(function(a, b) { return a.coordinates[0][0] - b.coordinates[0][0]; });
108+
assert.equal(lines[0].coordinates[0][0], -180);
109+
assert.equal(lines[lines.length - 1].coordinates[0][0], +170);
110+
},
111+
"default latitude ranges from 90°S (exclusive) to 90°N (exclusive)": function() {
112+
var lines = d3.geo.graticule().lines()
113+
.filter(function(line) { return line.coordinates[0][1] === line.coordinates[1][1]; })
114+
.sort(function(a, b) { return a.coordinates[0][1] - b.coordinates[0][1]; });
115+
assert.equal(lines[0].coordinates[0][1], -80);
116+
assert.equal(lines[lines.length - 1].coordinates[0][1], +80);
117+
},
118+
"default minor longitude lines extend from 80°S to 80°N": function() {
119+
var lines = d3.geo.graticule().lines()
120+
.filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; })
121+
.filter(function(line) { return Math.abs(line.coordinates[0][0] % 90) > ε; });
122+
lines.forEach(function(line) {
123+
assert.deepEqual(d3.extent(line.coordinates, function(p) { return p[1]; }), [-80 - ε, +80 + ε]);
124+
});
125+
},
126+
"default major longitude lines extend from 90°S to 90°N": function() {
127+
var lines = d3.geo.graticule().lines()
128+
.filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; })
129+
.filter(function(line) { return Math.abs(line.coordinates[0][0] % 90) < ε; });
130+
lines.forEach(function(line) {
131+
assert.deepEqual(d3.extent(line.coordinates, function(p) { return p[1]; }), [-90 + ε, +90 - ε]);
132+
});
133+
},
134+
"default latitude lines extend from 180°W to 180°E": function() {
135+
var lines = d3.geo.graticule().lines()
136+
.filter(function(line) { return line.coordinates[0][1] === line.coordinates[1][1]; });
137+
lines.forEach(function(line) {
138+
assert.deepEqual(d3.extent(line.coordinates, function(p) { return p[0]; }), [-180, +180]);
139+
});
140+
},
141+
"returns an array of LineStrings": function() {
142+
assert.deepEqual(d3.geo.graticule()
143+
.extent([[-90, -45], [90, 45]])
144+
.step([45, 45])
145+
.precision(3)
146+
.lines(), [
76147
{type: "LineString", coordinates: [[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45]]},
77148
{type: "LineString", coordinates: [[-45,-45],[-45,-42],[-45,-39],[-45,-36],[-45,-33],[-45,-30],[-45,-27],[-45,-24],[-45,-21],[-45,-18],[-45,-15],[-45,-12],[-45,-9],[-45,-6],[-45,-3],[-45,0],[-45,3],[-45,6],[-45,9],[-45,12],[-45,15],[-45,18],[-45,21],[-45,24],[-45,27],[-45,30],[-45,33],[-45,36],[-45,39],[-45,42],[-45,45]]},
78149
{type: "LineString", coordinates: [[0,-45],[0,-42],[0,-39],[0,-36],[0,-33],[0,-30],[0,-27],[0,-24],[0,-21],[0,-18],[0,-15],[0,-12],[0,-9],[0,-6],[0,-3],[0,0],[0,3],[0,6],[0,9],[0,12],[0,15],[0,18],[0,21],[0,24],[0,27],[0,30],[0,33],[0,36],[0,39],[0,42],[0,45]]},
@@ -81,6 +152,34 @@ suite.addBatch({
81152
{type: "LineString", coordinates: [[-90,0],[-87,0],[-84,0],[-81,0],[-78,0],[-75,0],[-72,0],[-69,0],[-66,0],[-63,0],[-60,0],[-57,0],[-54,0],[-51,0],[-48,0],[-45,0],[-42,0],[-39,0],[-36,0],[-33,0],[-30,0],[-27,0],[-24,0],[-21,0],[-18,0],[-15,0],[-12,0],[-9,0],[-6,0],[-3,0],[0,0],[3,0],[6,0],[9,0],[12,0],[15,0],[18,0],[21,0],[24,0],[27,0],[30,0],[33,0],[36,0],[39,0],[42,0],[45,0],[48,0],[51,0],[54,0],[57,0],[60,0],[63,0],[66,0],[69,0],[72,0],[75,0],[78,0],[81,0],[84,0],[87,0],[90,0]]}
82153
]);
83154
}
155+
},
156+
157+
"returns a MultiLineString of all lines": function() {
158+
var graticule = d3.geo.graticule()
159+
.extent([[-90, -45], [90, 45]])
160+
.step([45, 45])
161+
.precision(3);
162+
assert.deepEqual(graticule(), {
163+
type: "MultiLineString",
164+
coordinates: graticule.lines().map(function(line) { return line.coordinates; })
165+
});
166+
},
167+
168+
"outline": {
169+
"returns a Polygon encompassing the major extent": function() {
170+
assert.deepEqual(d3.geo.graticule()
171+
.majorExtent([[-90, -45], [90, 45]])
172+
.precision(3)
173+
.outline(), {
174+
type: "Polygon",
175+
coordinates: [[
176+
[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45],
177+
[-87,45],[-84,45],[-81,45],[-78,45],[-75,45],[-72,45],[-69,45],[-66,45],[-63,45],[-60,45],[-57,45],[-54,45],[-51,45],[-48,45],[-45,45],[-42,45],[-39,45],[-36,45],[-33,45],[-30,45],[-27,45],[-24,45],[-21,45],[-18,45],[-15,45],[-12,45],[-9,45],[-6,45],[-3,45],[0,45],[3,45],[6,45],[9,45],[12,45],[15,45],[18,45],[21,45],[24,45],[27,45],[30,45],[33,45],[36,45],[39,45],[42,45],[45,45],[48,45],[51,45],[54,45],[57,45],[60,45],[63,45],[66,45],[69,45],[72,45],[75,45],[78,45],[81,45],[84,45],[87,45],[90,45],
178+
[90,42],[90,39],[90,36],[90,33],[90,30],[90,27],[90,24],[90,21],[90,18],[90,15],[90,12],[90,9],[90,6],[90,3],[90,0],[90,-3],[90,-6],[90,-9],[90,-12],[90,-15],[90,-18],[90,-21],[90,-24],[90,-27],[90,-30],[90,-33],[90,-36],[90,-39],[90,-42],[90,-45],
179+
[87,-45],[84,-45],[81,-45],[78,-45],[75,-45],[72,-45],[69,-45],[66,-45],[63,-45],[60,-45],[57,-45],[54,-45],[51,-45],[48,-45],[45,-45],[42,-45],[39,-45],[36,-45],[33,-45],[30,-45],[27,-45],[24,-45],[21,-45],[18,-45],[15,-45],[12,-45],[9,-45],[6,-45],[3,-45],[0,-45],[-3,-45],[-6,-45],[-9,-45],[-12,-45],[-15,-45],[-18,-45],[-21,-45],[-24,-45],[-27,-45],[-30,-45],[-33,-45],[-36,-45],[-39,-45],[-42,-45],[-45,-45],[-48,-45],[-51,-45],[-54,-45],[-57,-45],[-60,-45],[-63,-45],[-66,-45],[-69,-45],[-72,-45],[-75,-45],[-78,-45],[-81,-45],[-84,-45],[-87,-45],[-90,-45]
180+
]]
181+
});
182+
}
84183
}
85184
}
86185
});

0 commit comments

Comments
 (0)