2019-02-27 20:22:38 +00:00
|
|
|
function det(a, b, c, d, e, f, g, h, i) {
|
2019-03-01 13:09:39 +00:00
|
|
|
return a * e * i + b * f * g + c * d * h - a * f * h - b * d * i - c * e * g;
|
2019-02-27 20:22:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function circleFromPoints(p1, p2, p3) {
|
|
|
|
const a = det(p1.x, p1.y, 1, p2.x, p2.y, 1, p3.x, p3.y, 1);
|
|
|
|
const bx = -det(p1.x * p1.x + p1.y * p1.y, p1.y, 1, p2.x * p2.x + p2.y * p2.y, p2.y, 1, p3.x * p3.x + p3.y * p3.y, p3.y, 1);
|
|
|
|
const by = det(p1.x * p1.x + p1.y * p1.y, p1.x, 1, p2.x * p2.x + p2.y * p2.y, p2.x, 1, p3.x * p3.x + p3.y * p3.y, p3.x, 1);
|
|
|
|
const c = -det(p1.x * p1.x + p1.y * p1.y, p1.x, p1.y, p2.x * p2.x + p2.y * p2.y, p2.x, p2.y, p3.x * p3.x + p3.y * p3.y, p3.x, p3.y);
|
|
|
|
|
|
|
|
return {
|
|
|
|
x: -bx / (2 * a),
|
|
|
|
y: -by / (2 * a),
|
2019-03-01 13:09:39 +00:00
|
|
|
radius: Math.sqrt(bx ** 2 + by ** 2 - 4 * a * c) / (2 * Math.abs(a)),
|
2019-02-27 20:22:38 +00:00
|
|
|
};
|
|
|
|
}
|