Skip to content

Commit 9447020

Browse files
committed
Add a WIP function to draw circular "real" lines
1 parent 694cbdb commit 9447020

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

src/plots/smith/smith.js

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,124 @@ proto.doAutoRange = function(fullLayout, polarLayout) {
348348
};
349349

350350
proto.updateRadialAxis = function(fullLayout, polarLayout) {
351+
var _this = this;
352+
var gd = _this.gd;
353+
var layers = _this.layers;
354+
var radius = _this.radius;
355+
var innerRadius = _this.innerRadius;
356+
var cx = _this.cx;
357+
var cy = _this.cy;
358+
var radialLayout = polarLayout.radialaxis;
359+
var a0 = mod(polarLayout.sector[0], 360);
360+
var ax = _this.radialAxis;
361+
var hasRoomForIt = true;
362+
363+
_this.fillViewInitialKey('radialaxis.angle', radialLayout.angle);
364+
_this.fillViewInitialKey('radialaxis.range', ax.range.slice());
365+
366+
ax.setGeometry();
367+
368+
// rotate auto tick labels by 180 if in quadrant II and III to make them
369+
// readable from left-to-right
370+
//
371+
// TODO try moving deeper in Axes.drawLabels for better results?
372+
if(ax.tickangle === 'auto' && (a0 > 90 && a0 <= 270)) {
373+
ax.tickangle = 180;
374+
}
375+
376+
// easier to set rotate angle with custom translate function
377+
var transFn = function(d) {
378+
return strTranslate(ax.l2p(d.x) + innerRadius, 0);
379+
};
380+
381+
// set special grid path function
382+
var gridPathFn = function(d) {
383+
var sq = function (x) { return x * x; };
384+
var gammaX = function(re) {
385+
var denom = sq(re + 1.0);
386+
var result = (sq(re) - 1.0) / denom;
387+
return result;
388+
}
389+
var gamma_x = gammaX(d.x);
390+
391+
var gridRadius = 0.5 * (_this.radius - ax.r2p(gamma_x));
392+
var gridCenter = gridRadius + ax.r2p(gamma_x);
393+
return Lib.pathArc(gridRadius, 0, 2 * Math.PI, gridCenter, 0);
394+
};
395+
396+
var newTickLayout = strTickLayout(radialLayout);
397+
if(_this.radialTickLayout !== newTickLayout) {
398+
layers['radial-axis'].selectAll('.xtick').remove();
399+
_this.radialTickLayout = newTickLayout;
400+
}
401+
402+
if(hasRoomForIt) {
403+
ax.setScale();
404+
405+
var vals = Axes.calcTicks(ax);
406+
var valsClipped = Axes.clipEnds(ax, vals);
407+
var tickSign = Axes.getTickSigns(ax)[2];
408+
409+
Axes.drawTicks(gd, ax, {
410+
vals: vals,
411+
layer: layers['radial-axis'],
412+
path: Axes.makeTickPath(ax, 0, tickSign),
413+
transFn: transFn,
414+
crisp: false
415+
});
416+
417+
Axes.drawGrid(gd, ax, {
418+
vals: valsClipped,
419+
layer: layers['radial-grid'],
420+
path: gridPathFn,
421+
transFn: Lib.noop,
422+
crisp: false
423+
});
424+
425+
Axes.drawLabels(gd, ax, {
426+
vals: vals,
427+
layer: layers['radial-axis'],
428+
transFn: transFn,
429+
labelFns: Axes.makeLabelFns(ax, 0)
430+
});
431+
}
432+
433+
// stash 'actual' radial axis angle for drag handlers (in degrees)
434+
var angle = _this.radialAxisAngle = _this.vangles ?
435+
rad2deg(snapToVertexAngle(deg2rad(radialLayout.angle), _this.vangles)) :
436+
radialLayout.angle;
437+
438+
var tLayer = strTranslate(cx, cy);
439+
var tLayer2 = tLayer + strRotate(-angle);
440+
441+
updateElement(
442+
layers['radial-axis'],
443+
hasRoomForIt && (radialLayout.showticklabels || radialLayout.ticks),
444+
{transform: tLayer2}
445+
);
446+
447+
updateElement(
448+
layers['radial-grid'],
449+
hasRoomForIt && radialLayout.showgrid,
450+
{transform: tLayer}
451+
);
452+
453+
updateElement(
454+
layers['radial-line'].select('line'),
455+
hasRoomForIt && radialLayout.showline,
456+
{
457+
x1: innerRadius,
458+
y1: 0,
459+
x2: radius,
460+
y2: 0,
461+
transform: tLayer2
462+
}
463+
)
464+
.attr('stroke-width', radialLayout.linewidth)
465+
.call(Color.stroke, radialLayout.linecolor);
466+
}
467+
468+
proto._updateRadialAxis = function(fullLayout, polarLayout) {
351469
var _this = this;
352470
var gd = _this.gd;
353471
var layers = _this.layers;

0 commit comments

Comments
 (0)