Dot radii were tuned for a 300pt frame; sub-linear scaling keeps small orbs legible.
double radiusScale(double size, double pow) => math.pow(size / 300, pow).toDouble();