docs: private ScalesResult run(Relation<? extends NumberVector> rel) {
      double[][] mms = RelationUtil.computeMinMax(rel);
      int dim = mms[0].length;
      double delta = 0.;
      for(int d = 0; d < dim; d++) {
        double del = mms[1][d] - mms[0][d];
        delta = del > delta ? del : delta;
      }
      if(delta < Double.MIN_NORMAL) {
        delta = 1.;
      }
      int log10res = (int) Math.ceil(Math.log10(delta / (LinearScale.MAXTICKS - 1)));
      double res = MathUtil.powi(10, log10res);
      double target = Math.ceil(delta / res) * res; // Target width
      LinearScale[] scales = new LinearScale[dim];
      for(int d = 0; d < dim; d++) {
        double mid = (mms[0][d] + mms[1][d] - target) * .5;
        double min = Math.floor(mid / res) * res;
        double max = Math.ceil((mid + target) / res) * res;
        scales[d] = new LinearScale(min, max);
      }
      return new ScalesResult(scales);
    }