Skip to content

Commit e938974

Browse files
committed
standardize API of polar internal routine
- always use angles in radians in angles.js and polar/helpers.js - adapt polar/helpers.js call signatures to match the ones in angles.js
1 parent a32484a commit e938974

File tree

6 files changed

+96
-104
lines changed

6 files changed

+96
-104
lines changed

Diff for: src/lib/angles.js

+31-31
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'use strict';
1010

1111
var PI = Math.PI;
12+
var twoPI = 2 * PI;
1213

1314
function deg2rad(deg) {
1415
return deg / 180 * PI;
@@ -32,12 +33,11 @@ function wrap180(deg) {
3233
* is sector a full circle?
3334
* ... this comes up a lot in SVG path-drawing routines
3435
*
35-
* @param {2-item array} sector sector angles in *degrees*
36+
* @param {2-item array} aBnds : angular bounds in *radians*
3637
* @return {boolean}
3738
*/
38-
function isFullCircle(sector) {
39-
var arc = Math.abs(sector[1] - sector[0]);
40-
return arc === 360;
39+
function isFullCircle(aBnds) {
40+
return Math.abs(aBnds[1] - aBnds[0]) === twoPI;
4141
}
4242

4343
/**
@@ -68,24 +68,24 @@ function angleDist(a, b) {
6868
* is angle inside sector?
6969
*
7070
* @param {number} a : angle to test in *radians*
71-
* @param {2-item array} sector : sector angles in *degrees*
71+
* @param {2-item array} aBnds : sector's angular bounds in *radians*
7272
* @param {boolean}
7373
*/
74-
function isAngleInsideSector(a, sector) {
75-
if(isFullCircle(sector)) return true;
74+
function isAngleInsideSector(a, aBnds) {
75+
if(isFullCircle(aBnds)) return true;
7676

7777
var s0, s1;
7878

79-
if(sector[0] < sector[1]) {
80-
s0 = sector[0];
81-
s1 = sector[1];
79+
if(aBnds[0] < aBnds[1]) {
80+
s0 = aBnds[0];
81+
s1 = aBnds[1];
8282
} else {
83-
s0 = sector[1];
84-
s1 = sector[0];
83+
s0 = aBnds[1];
84+
s1 = aBnds[0];
8585
}
8686

87-
s0 = wrap360(s0);
88-
s1 = wrap360(s1);
87+
s0 = wrap360(rad2deg(s0));
88+
s1 = wrap360(rad2deg(s1));
8989
if(s0 > s1) s1 += 360;
9090

9191
var a0 = wrap360(rad2deg(a));
@@ -99,21 +99,21 @@ function isAngleInsideSector(a, sector) {
9999
*
100100
* @param {number} r : pt's radial coordinate
101101
* @param {number} a : pt's angular coordinate in *radians*
102-
* @param {2-item array} rRng : sector's radial range
103-
* @param {2-item array} sector : sector angles in *degrees*
102+
* @param {2-item array} rBnds : sector's radial bounds
103+
* @param {2-item array} aBnds : sector's angular bounds in *radians*
104104
* @return {boolean}
105105
*/
106-
function isPtInsideSector(r, a, rRng, sector) {
107-
if(!isAngleInsideSector(a, sector)) return false;
106+
function isPtInsideSector(r, a, rBnds, aBnds) {
107+
if(!isAngleInsideSector(a, aBnds)) return false;
108108

109109
var r0, r1;
110110

111-
if(rRng[0] < rRng[1]) {
112-
r0 = rRng[0];
113-
r1 = rRng[1];
111+
if(rBnds[0] < rBnds[1]) {
112+
r0 = rBnds[0];
113+
r1 = rBnds[1];
114114
} else {
115-
r0 = rRng[1];
116-
r1 = rRng[0];
115+
r0 = rBnds[1];
116+
r1 = rBnds[0];
117117
}
118118

119119
return r >= r0 && r <= r1;
@@ -124,14 +124,14 @@ function _path(r0, r1, a0, a1, cx, cy, isClosed) {
124124
cx = cx || 0;
125125
cy = cy || 0;
126126

127-
var isCircle = isFullCircle([a0, a1].map(rad2deg));
127+
var isCircle = isFullCircle([a0, a1]);
128128
var aStart, aMid, aEnd;
129129
var rStart, rEnd;
130130

131131
if(isCircle) {
132132
aStart = 0;
133133
aMid = PI;
134-
aEnd = 2 * PI;
134+
aEnd = twoPI;
135135
} else {
136136
if(a0 < a1) {
137137
aStart = a0;
@@ -195,8 +195,8 @@ function _path(r0, r1, a0, a1, cx, cy, isClosed) {
195195
* path an arc
196196
*
197197
* @param {number} r : radius
198-
* @param {number} a0 : first angular coordinate
199-
* @param {number} a1 : second angular coordinate
198+
* @param {number} a0 : first angular coordinate in *radians*
199+
* @param {number} a1 : second angular coordinate in *radians*
200200
* @param {number (optional)} cx : x coordinate of center
201201
* @param {number (optional)} cy : y coordinate of center
202202
* @return {string} svg path
@@ -209,8 +209,8 @@ function pathArc(r, a0, a1, cx, cy) {
209209
* path a sector
210210
*
211211
* @param {number} r : radius
212-
* @param {number} a0 : first angular coordinate
213-
* @param {number} a1 : second angular coordinate
212+
* @param {number} a0 : first angular coordinate in *radians*
213+
* @param {number} a1 : second angular coordinate in *radians*
214214
* @param {number (optional)} cx : x coordinate of center
215215
* @param {number (optional)} cy : y coordinate of center
216216
* @return {string} svg path
@@ -224,8 +224,8 @@ function pathSector(r, a0, a1, cx, cy) {
224224
*
225225
* @param {number} r0 : first radial coordinate
226226
* @param {number} r1 : second radial coordinate
227-
* @param {number} a0 : first angular coordinate
228-
* @param {number} a1 : second angular coordinate
227+
* @param {number} a0 : first angular coordinate in *radians*
228+
* @param {number} a1 : second angular coordinate in *radians*
229229
* @param {number (optional)} cx : x coordinate of center
230230
* @param {number (optional)} cy : y coordinate of center
231231
* @return {string} svg path

Diff for: src/plots/polar/helpers.js

+33-35
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,33 @@ var findIndexOfMin = Lib.findIndexOfMin;
1515
var isAngleInsideSector = Lib.isAngleInsideSector;
1616
var angleDelta = Lib.angleDelta;
1717
var angleDist = Lib.angleDist;
18-
var deg2rad = Lib.deg2rad;
1918

2019
/**
2120
* is pt (r,a) inside polygon made up vertices at angles 'vangles'
2221
* inside a given polar sector
2322
*
2423
* @param {number} r : pt's radial coordinate
2524
* @param {number} a : pt's angular coordinate in *radians*
26-
* @param {2-item array} rRng : sector's radial range
27-
* @param {2-item array} sector : sector angles in *degrees*
25+
* @param {2-item array} rBnds : sector's radial bounds
26+
* @param {2-item array} aBnds : sector's angular bounds *radians*
2827
* @param {array} vangles : angles of polygon vertices in *radians*
2928
* @return {boolean}
3029
*/
31-
function isPtInsidePolygon(r, a, rRng, sector, vangles) {
32-
if(!isAngleInsideSector(a, sector)) return false;
30+
function isPtInsidePolygon(r, a, rBnds, aBnds, vangles) {
31+
if(!isAngleInsideSector(a, aBnds)) return false;
3332

3433
var r0, r1;
3534

36-
if(rRng[0] < rRng[1]) {
37-
r0 = rRng[0];
38-
r1 = rRng[1];
35+
if(rBnds[0] < rBnds[1]) {
36+
r0 = rBnds[0];
37+
r1 = rBnds[1];
3938
} else {
40-
r0 = rRng[1];
41-
r1 = rRng[0];
39+
r0 = rBnds[1];
40+
r1 = rBnds[0];
4241
}
4342

44-
var polygonIn = polygonTester(makePolygon(r0, sector, vangles));
45-
var polygonOut = polygonTester(makePolygon(r1, sector, vangles));
43+
var polygonIn = polygonTester(makePolygon(r0, aBnds[0], aBnds[1], vangles));
44+
var polygonOut = polygonTester(makePolygon(r1, aBnds[0], aBnds[1], vangles));
4645
var xy = [r * Math.cos(a), r * Math.sin(a)];
4746
return polygonOut.contains(xy) && !polygonIn.contains(xy);
4847
}
@@ -128,7 +127,7 @@ function makeRegularPolygon(r, vangles) {
128127
return vertices;
129128
}
130129

131-
function makeClippedPolygon(r, sector, vangles) {
130+
function makeClippedPolygon(r, a0, a1, vangles) {
132131
var len = vangles.length;
133132
var vertices = [];
134133
var i, j;
@@ -146,18 +145,15 @@ function makeClippedPolygon(r, sector, vangles) {
146145
}
147146

148147
function isInside(v) {
149-
return isAngleInsideSector(v, sector);
148+
return isAngleInsideSector(v, [a0, a1]);
150149
}
151150

152-
var s0 = deg2rad(sector[0]);
153-
var s1 = deg2rad(sector[1]);
154-
155-
// find index in sector closest to sector[0],
151+
// find index in sector closest to a0
156152
// use it to find intersection of v[i0] <-> v[i0-1] edge with sector radius
157153
var i0 = findIndexOfMin(vangles, function(v) {
158-
return isInside(v) ? angleDist(v, s0) : Infinity;
154+
return isInside(v) ? angleDist(v, a0) : Infinity;
159155
});
160-
var xy0 = findXY(vangles[i0], vangles[cycleIndex(i0 - 1)], s0);
156+
var xy0 = findXY(vangles[i0], vangles[cycleIndex(i0 - 1)], a0);
161157
vertices.push(xy0);
162158

163159
// fill in in-sector vertices
@@ -167,12 +163,12 @@ function makeClippedPolygon(r, sector, vangles) {
167163
vertices.push(a2xy(va));
168164
}
169165

170-
// find index in sector closest to sector[1],
166+
// find index in sector closest to a1,
171167
// use it to find intersection of v[iN] <-> v[iN+1] edge with sector radius
172168
var iN = findIndexOfMin(vangles, function(v) {
173-
return isInside(v) ? angleDist(v, s1) : Infinity;
169+
return isInside(v) ? angleDist(v, a1) : Infinity;
174170
});
175-
var xyN = findXY(vangles[iN], vangles[cycleIndex(iN + 1)], s1);
171+
var xyN = findXY(vangles[iN], vangles[cycleIndex(iN + 1)], a1);
176172
vertices.push(xyN);
177173

178174
vertices.push([0, 0]);
@@ -181,16 +177,16 @@ function makeClippedPolygon(r, sector, vangles) {
181177
return vertices;
182178
}
183179

184-
function makePolygon(r, sector, vangles) {
185-
return Lib.isFullCircle(sector) ?
180+
function makePolygon(r, a0, a1, vangles) {
181+
return Lib.isFullCircle([a0, a1]) ?
186182
makeRegularPolygon(r, vangles) :
187-
makeClippedPolygon(r, sector, vangles);
183+
makeClippedPolygon(r, a0, a1, vangles);
188184
}
189185

190-
function findPolygonOffset(r, sector, vangles) {
186+
function findPolygonOffset(r, a0, a1, vangles) {
191187
var minX = Infinity;
192188
var minY = Infinity;
193-
var vertices = makePolygon(r, sector, vangles);
189+
var vertices = makePolygon(r, a0, a1, vangles);
194190

195191
for(var i = 0; i < vertices.length; i++) {
196192
var v = vertices[i];
@@ -240,15 +236,16 @@ function transformForSVG(pts0, cx, cy) {
240236
* path polygon
241237
*
242238
* @param {number} r : polygon 'radius'
243-
* @param {2-item array} sector : polar sector in which polygon is clipped
239+
* @param {number} a0 : first angular coordinate in *radians*
240+
* @param {number} a1 : second angular coordinate in *radians*
244241
* @param {array} vangles : angles of polygon vertices in *radians*
245242
* @param {number (optional)} cx : x coordinate of center
246243
* @param {number (optional)} cy : y coordinate of center
247244
* @return {string} svg path
248245
*
249246
*/
250-
function pathPolygon(r, sector, vangles, cx, cy) {
251-
var poly = makePolygon(r, sector, vangles);
247+
function pathPolygon(r, a0, a1, vangles, cx, cy) {
248+
var poly = makePolygon(r, a0, a1, vangles);
252249
return 'M' + transformForSVG(poly, cx, cy).join('L');
253250
}
254251

@@ -260,14 +257,15 @@ function pathPolygon(r, sector, vangles, cx, cy) {
260257
*
261258
* @param {number} r0 : first radial coordinate
262259
* @param {number} r1 : second radial coordinate
263-
* @param {2-item array} sector : polar sector in which polygon is clipped
260+
* @param {number} a0 : first angular coordinate in *radians*
261+
* @param {number} a1 : second angular coordinate in *radians*
264262
* @param {array} vangles : angles of polygon vertices in *radians*
265263
* @param {number (optional)} cx : x coordinate of center
266264
* @param {number (optional)} cy : y coordinate of center
267265
* @return {string} svg path
268266
*
269267
*/
270-
function pathPolygonAnnulus(r0, r1, sector, vangles, cx, cy) {
268+
function pathPolygonAnnulus(r0, r1, a0, a1, vangles, cx, cy) {
271269
var rStart, rEnd;
272270

273271
if(r0 < r1) {
@@ -278,8 +276,8 @@ function pathPolygonAnnulus(r0, r1, sector, vangles, cx, cy) {
278276
rEnd = r0;
279277
}
280278

281-
var inner = transformForSVG(makePolygon(rStart, sector, vangles), cx, cy);
282-
var outer = transformForSVG(makePolygon(rEnd, sector, vangles), cx, cy);
279+
var inner = transformForSVG(makePolygon(rStart, a0, a1, vangles), cx, cy);
280+
var outer = transformForSVG(makePolygon(rEnd, a0, a1, vangles), cx, cy);
283281
return 'M' + outer.reverse().join('L') + 'M' + inner.join('L');
284282
}
285283

0 commit comments

Comments
 (0)