48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import Component from '@glimmer/component';
|
|
import { tracked } from '@glimmer/tracking';
|
|
|
|
const size = 336;
|
|
const insetSize = size / 2 - 8;
|
|
const inset = function (num) {
|
|
return insetSize * num;
|
|
};
|
|
const milliseconds = function (num, max) {
|
|
return max > 0 ? parseInt(max * num) / 100 : 0;
|
|
};
|
|
export default class TomographyGraph extends Component {
|
|
@tracked max = -999999999;
|
|
size = size;
|
|
|
|
circle = [inset(1), inset(0.25), inset(0.5), inset(0.75), inset(1)];
|
|
labels = [inset(-0.25), inset(-0.5), inset(-0.75), inset(-1)];
|
|
|
|
get milliseconds() {
|
|
const distances = this.args.distances || [];
|
|
const max = distances.reduce((prev, d) => Math.max(prev, d.distance), this.max);
|
|
return [25, 50, 75, 100].map((item) => milliseconds(item, max));
|
|
}
|
|
|
|
get distances() {
|
|
let distances = this.args.distances || [];
|
|
const max = distances.reduce((prev, d) => Math.max(prev, d.distance), this.max);
|
|
const len = distances.length;
|
|
if (len > 360) {
|
|
// We have more nodes than we want to show, take a random sampling to keep
|
|
// the number around 360.
|
|
const sampling = 360 / len;
|
|
distances = distances.filter(function (_, i) {
|
|
return i == 0 || i == len - 1 || Math.random() < sampling;
|
|
});
|
|
}
|
|
return distances.map((d, i) => {
|
|
return {
|
|
rotate: (i * 360) / distances.length,
|
|
y2: insetSize * (d.distance / max),
|
|
node: d.node,
|
|
distance: d.distance,
|
|
segment: d.segment,
|
|
};
|
|
});
|
|
}
|
|
}
|