mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
* Shrink timeline height to 55px and make years fade out as hours fade in. * Address the comments.
47 lines
1.3 KiB
JavaScript
47 lines
1.3 KiB
JavaScript
|
|
// http://stackoverflow.com/questions/4467539/javascript-modulo-not-behaving
|
|
//
|
|
// A modulo that "behaves" w/ negatives.
|
|
//
|
|
// modulo(5, 5) => 0
|
|
// modulo(4, 5) => 4
|
|
// modulo(3, 5) => 3
|
|
// modulo(2, 5) => 2
|
|
// modulo(1, 5) => 1
|
|
// modulo(0, 5) => 0
|
|
// modulo(-1, 5) => 4
|
|
// modulo(-2, 5) => 3
|
|
// modulo(-3, 5) => 2
|
|
// modulo(-4, 5) => 1
|
|
// modulo(-5, 5) => 0
|
|
//
|
|
export function modulo(i, n) {
|
|
return ((i % n) + n) % n;
|
|
}
|
|
|
|
function euclideanDistance(pointA, pointB) {
|
|
const dx = pointA.get('x') - pointB.get('x');
|
|
const dy = pointA.get('y') - pointB.get('y');
|
|
return Math.sqrt((dx * dx) + (dy * dy));
|
|
}
|
|
|
|
// This could be solved in O(N log N) (see https://en.wikipedia.org/wiki/Closest_pair_of_points_problem),
|
|
// but this brute-force O(N^2) should be good enough for a reasonable number of nodes.
|
|
export function minEuclideanDistanceBetweenPoints(points) {
|
|
let minDistance = Infinity;
|
|
points.forEach((pointA, idA) => {
|
|
points.forEach((pointB, idB) => {
|
|
const distance = euclideanDistance(pointA, pointB);
|
|
if (idA !== idB && distance < minDistance) {
|
|
minDistance = distance;
|
|
}
|
|
});
|
|
});
|
|
return minDistance;
|
|
}
|
|
|
|
// A linear mapping [a, b] -> [0, 1] (maps value x=a into 0 and x=b into 1).
|
|
export function linearGradientValue(x, [a, b]) {
|
|
return (x - a) / (b - a);
|
|
}
|