d3-regression
Version:
Calculate statistical regressions for two-dimensional data
40 lines (32 loc) • 948 B
JavaScript
import { angle, midpoint } from "./geometry";
// Given a start point, an end point, and a prediciton function,
// returns a smooth line.
export function interpose(xmin, xmax, predict){
const l = Math.log(xmax - xmin) * Math.LOG10E + 1 | 0;
const precision = 1 * Math.pow(10, -l / 2 - 1), maxIter = 1e4;
let points = [px(xmin), px(xmax)], iter = 0;
while (find(points) && iter < maxIter);
return points;
function px(x){
return [x, predict(x)];
}
function find(points){
iter++;
const n = points.length;
let found = false;
for (let i = 0; i < n - 1; i++){
const p0 = points[i],
p1 = points[i + 1],
m = midpoint([p0, p1]),
mp = px(m[0]),
a0 = angle([p0, m]),
a1 = angle([p0, mp]),
a = Math.abs(a0 - a1);
if (a > precision){
points.splice(i + 1, 0, mp);
found = true;
}
}
return found;
}
}