Circle2d::Circle(
        const Point2d& firstPoint,
        const Point2d& secondPoint,
        const Point2d& thirdPoint
    ) : _radius(0.0) {

        double a = (secondPoint - firstPoint).norm();
        double b = (thirdPoint - secondPoint).norm();
        double c = (firstPoint - thirdPoint).norm();
        double s = (a + b + c) / 2.0;

        if(s - a <= Zero() || s - b <= Zero() || s - c <= Zero()) {
            // Points are collinear
            throw Error(new PlaceholderError());
        }

        double a2 = a * a;
        double b2 = b * b;
        double c2 = c * c;
        double t1 = a2 * (b2 + c2 - a2);
        double t2 = b2 * (c2 + a2 - b2);
        double t3 = c2 * (a2 + b2 - c2);
        double sum = t1 + t2 + t3;
        t1 /= sum;
        t2 /= sum;
        t3 /= sum;

        _centerPoint = Point2d(
            t1 * thirdPoint.components() +
            t2 * firstPoint.components() +
            t3 * secondPoint.components()
        );

        double firstRadius = (firstPoint - _centerPoint).norm();
        double secondRadius = (secondPoint - _centerPoint).norm();
        double thirdRadius = (thirdPoint - _centerPoint).norm();
        _radius = (firstRadius + secondRadius + thirdRadius) / 3.0;
        
        assert(_radius - firstRadius == Zero());
        assert(_radius - secondRadius == Zero());
        assert(_radius - thirdRadius == Zero());
    }