docs: public static void computePositions(Node node, int depth, double aoff, double awid, double radius, double radiusinc) {
      node.x = FastMath.sin(aoff) * radius;
      node.y = FastMath.cos(aoff) * radius;
  
      // Angular width per weight
      double cwid = awid / node.weight;
      // Avoid overly wide angles - shrink radius if necessary.
      double div = 1;
      if(node.weight > 1) {
        double s = FastMath.sin(awid * .5), c = FastMath.cos(awid * .5);
        double dx = s * (depth + 1), dy = c * (depth + 1) - depth;
        double d = FastMath.sqrt(dx * dx + dy * dy) / MathUtil.SQRT2;
        div = Math.max(div, d);
      }
      // Angular position of current child:
      double cang = aoff - awid * .5 / div;
      final double adjwid = cwid / div;
      for(Node c : node.children) {
        computePositions(c, depth + 1, cang + adjwid * c.weight * .5, adjwid * c.weight, radius + radiusinc, radiusinc);
        cang += adjwid * c.weight;
      }
    }