phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
78 lines (64 loc) • 2.07 kB
JavaScript
/**
* @author Richard Davey <rich@phaser.io>
* @copyright 2013-2025 Phaser Studio Inc.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
var Circle = require('../circle/Circle');
// Adapted from https://gist.github.com/mutoo/5617691
/**
* Finds the circumscribed circle (circumcircle) of a Triangle object. The circumcircle is the circle which touches all of the triangle's vertices.
*
* @function Phaser.Geom.Triangle.CircumCircle
* @since 3.0.0
*
* @generic {Phaser.Geom.Circle} O - [out,$return]
*
* @param {Phaser.Geom.Triangle} triangle - The Triangle to use as input.
* @param {Phaser.Geom.Circle} [out] - An optional Circle to store the result in.
*
* @return {Phaser.Geom.Circle} The updated `out` Circle, or a new Circle if none was provided.
*/
var CircumCircle = function (triangle, out)
{
if (out === undefined) { out = new Circle(); }
// A
var x1 = triangle.x1;
var y1 = triangle.y1;
// B
var x2 = triangle.x2;
var y2 = triangle.y2;
// C
var x3 = triangle.x3;
var y3 = triangle.y3;
var A = x2 - x1;
var B = y2 - y1;
var C = x3 - x1;
var D = y3 - y1;
var E = A * (x1 + x2) + B * (y1 + y2);
var F = C * (x1 + x3) + D * (y1 + y3);
var G = 2 * (A * (y3 - y2) - B * (x3 - x2));
var dx;
var dy;
// If the points of the triangle are collinear, then just find the
// extremes and use the midpoint as the center of the circumcircle.
if (Math.abs(G) < 0.000001)
{
var minX = Math.min(x1, x2, x3);
var minY = Math.min(y1, y2, y3);
dx = (Math.max(x1, x2, x3) - minX) * 0.5;
dy = (Math.max(y1, y2, y3) - minY) * 0.5;
out.x = minX + dx;
out.y = minY + dy;
out.radius = Math.sqrt(dx * dx + dy * dy);
}
else
{
out.x = (D * E - B * F) / G;
out.y = (A * F - C * E) / G;
dx = out.x - x1;
dy = out.y - y1;
out.radius = Math.sqrt(dx * dx + dy * dy);
}
return out;
};
module.exports = CircumCircle;