plotly.js
Version:
The open source javascript graphing library that powers plotly
94 lines (74 loc) • 2.06 kB
JavaScript
function sign(x) {
return (
x < 0 ? -1 :
x > 0 ? 1 : 0
);
}
// adapted from Mike Bostock's https://observablehq.com/@mbostock/smith-chart
function smith(a) {
var R = a[0];
var X = a[1];
if(!isFinite(R) || !isFinite(X)) return [1, 0];
var D = (R + 1) * (R + 1) + X * X;
return [(R * R + X * X - 1) / D, 2 * X / D];
}
function transform(subplot, a) {
var x = a[0];
var y = a[1];
return [
x * subplot.radius + subplot.cx,
-y * subplot.radius + subplot.cy
];
}
function scale(subplot, r) {
return r * subplot.radius;
}
function reactanceArc(subplot, X, R1, R2) {
var t1 = transform(subplot, smith([R1, X]));
var x1 = t1[0];
var y1 = t1[1];
var t2 = transform(subplot, smith([R2, X]));
var x2 = t2[0];
var y2 = t2[1];
if(X === 0) {
return [
'M' + x1 + ',' + y1,
'L' + x2 + ',' + y2
].join(' ');
}
var r = scale(subplot, 1 / Math.abs(X));
return [
'M' + x1 + ',' + y1,
'A' + r + ',' + r + ' 0 0,' + (X < 0 ? 1 : 0) + ' ' + x2 + ',' + y2
].join(' ');
}
function resistanceArc(subplot, R, X1, X2) {
var r = scale(subplot, 1 / (R + 1));
var t1 = transform(subplot, smith([R, X1]));
var x1 = t1[0];
var y1 = t1[1];
var t2 = transform(subplot, smith([R, X2]));
var x2 = t2[0];
var y2 = t2[1];
if(sign(X1) !== sign(X2)) {
var t0 = transform(subplot, smith([R, 0]));
var x0 = t0[0];
var y0 = t0[1];
return [
'M' + x1 + ',' + y1,
'A' + r + ',' + r + ' 0 0,' + (0 < X1 ? 0 : 1) + ' ' + x0 + ',' + y0,
'A' + r + ',' + r + ' 0 0,' + (X2 < 0 ? 0 : 1) + x2 + ',' + y2,
].join(' ');
}
return [
'M' + x1 + ',' + y1,
'A' + r + ',' + r + ' 0 0,' + (X2 < X1 ? 0 : 1) + ' ' + x2 + ',' + y2
].join(' ');
}
module.exports = {
smith: smith,
reactanceArc: reactanceArc,
resistanceArc: resistanceArc,
smithTransform: transform
};
;