65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', { value: true });
 | 
						|
 | 
						|
/**
 | 
						|
 * @copyright 2013 Sonia Keys
 | 
						|
 * @copyright 2016 commenthol
 | 
						|
 * @license MIT
 | 
						|
 * @module circle
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Smallest finds the smallest circle containing three points.
 | 
						|
 *
 | 
						|
 * Arguments should represent coordinates in right ascension and declination
 | 
						|
 * or longitude and latitude.  Result Δ is the diameter of the circle, typeI
 | 
						|
 * is true if solution is of type I.
 | 
						|
 *
 | 
						|
 * @param {Coord} c1 - ra, dec point 1
 | 
						|
 * @param {Coord} c2 - ra, dec point 2
 | 
						|
 * @param {Coord} c3 - ra, dec point 3
 | 
						|
 * @returns {Array} [Δ, typeI]
 | 
						|
 *  {Number} Δ - diameter of the circle
 | 
						|
 *  {Number} typeI - true - Two points on circle, one interior.
 | 
						|
 *                   false - All three points on circle.
 | 
						|
 */
 | 
						|
function smallest (c1, c2, c3) {
 | 
						|
  // Using haversine formula
 | 
						|
  const cd1 = Math.cos(c1.dec);
 | 
						|
  const cd2 = Math.cos(c2.dec);
 | 
						|
  const cd3 = Math.cos(c3.dec);
 | 
						|
  let a = 2 * Math.asin(Math.sqrt(hav(c2.dec - c1.dec) + cd1 * cd2 * hav(c2.ra - c1.ra)));
 | 
						|
  let b = 2 * Math.asin(Math.sqrt(hav(c3.dec - c2.dec) + cd2 * cd3 * hav(c3.ra - c2.ra)));
 | 
						|
  let c = 2 * Math.asin(Math.sqrt(hav(c1.dec - c3.dec) + cd3 * cd1 * hav(c1.ra - c3.ra)));
 | 
						|
  if (b > a) {
 | 
						|
    [a, b] = noswap(b, a);
 | 
						|
  }
 | 
						|
  if (c > a) {
 | 
						|
    [a, c] = noswap(c, a);
 | 
						|
  }
 | 
						|
  if (a * a >= b * b + c * c) {
 | 
						|
    return [a, true]
 | 
						|
  }
 | 
						|
  // (20.1) p. 128
 | 
						|
  return [2 * a * b * c / Math.sqrt((a + b + c) * (a + b - c) * (b + c - a) * (a + c - b)), false]
 | 
						|
}
 | 
						|
 | 
						|
const noswap = function (a, b) {
 | 
						|
  return [a, b]
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * haversine function (17.5) p. 115
 | 
						|
 */
 | 
						|
const hav = function (a) {
 | 
						|
  return 0.5 * (1 - Math.cos(a))
 | 
						|
};
 | 
						|
 | 
						|
var circle = {
 | 
						|
  smallest
 | 
						|
};
 | 
						|
 | 
						|
exports["default"] = circle;
 | 
						|
exports.smallest = smallest;
 |