docs: private void computeConvexHull() {
      // Trivial cases
      if(points.size() < 3) {
        this.ok = true;
        return;
      }
      // Avoid numerical instabilities by rescaling
      double maxX = Math.max(Math.abs(minmaxX.getMin()), Math.abs(minmaxX.getMax()));
      double maxY = Math.max(Math.abs(minmaxY.getMin()), Math.abs(minmaxY.getMax()));
      if(maxX < 10.0 || maxY < 10.0) {
        factor = 10 / maxX;
        if(10 / maxY > factor) {
          factor = 10 / maxY;
        }
      }
      // Find the new origin point
      findStartingPoint();
      // Sort points for the scan
      final double[] origin = points.get(0);
      Collections.sort(this.points, new Comparator<double[]>() {
        @Override
        public int compare(double[] o1, double[] o2) {
          return isLeft(o1, o2, origin);
        }
      });
      grahamScan();
      this.ok = true;
    }