Smallest enclosing circle
Demo (JavaScript)
This JavaScript program computes the smallest circle that encloses an arbitrary set of points in the plane. Points defining the circumference are colored red; points in the interior are colored gray. Instructions for manual positioning mode:
Leftclick in a blank space to add a new point
Leftclick an existing point and drag to move it
Rightclick an existing point to delete it
Description
Although the problem looks easy to solve visually, the algorithm is in fact moderately long and quite tricky. (This deceptive difficulty is a common theme in computational geometry.) I don’t fully understand how to solve this problem from scratch, and my program’s implementation relies heavily on the mathematics and reasoning covered in the PDF below. This randomized algorithm runs in expected linear time, unlike the naive Θ(n^{4}) algorithm. Thus it can handle thousands of points with ease.
Source code
 Java (SE 7+)

 SmallestEnclosingCircle.java (computation functions)
 SmallestEnclosingCircleTest.java (JUnit test suite)
 JavaScript

 smallestenclosingcircle.js (computation functions)
 smallestenclosingcircledemo.js (the demo on this page)
 TypeScript

 smallestenclosingcircle.ts (computation functions)
The public API is identical to the handwritten JavaScript version.
 smallestenclosingcircle.ts (computation functions)
 Python (compatible with 2 and 3)

 smallestenclosingcircle.py (computation functions)
 smallestenclosingcircletest.py (test suite)
 C# (.NET 4.0+)

 SmallestEnclosingCircle.cs (computation functions)
 SmallestEnclosingCircleTest.cs (test suite)
 C++ (C++11 and above)

 SmallestEnclosingCircle.cpp (computation functions)
 SmallestEnclosingCircle.hpp (header file)
 SmallestEnclosingCircleTest.cpp (test suite)
The Java version is considered the reference version because it has object types and the code is structured more clearly. License: GNU Lesser General Public License v3.0+
More info
 Wikipedia: Smallestcircle problem
 Geometric Algorithms: Smallest enclosing circles and more (Utrecht University) (PDF)