Алгоритм куба не даст равномерного распределения по сфере - в частности, области вблизи проекций углов будут иметь наиболее плотное распределение точек, а вблизи центров граней кубов будут самые низкие.
Вы можете понять это интуитивно, поскольку объем куба, проецируемого на нижележащую сферу, больше вблизи углов, которые расположены около центров граней кубов.Фактически, объем маленького кусочка (который проецируется на маленький круг на сфере) пропорционален кубу размера вектора от начала координат через центр малого круга до точки на сфере, которую он пересекает.
Таким образом, относительный объем в центре грани куба (например, (1,0,0)) равен 1, но для угла (например, (1,1,1)) это куб sqrt (3)или 1,73 куба, примерно 5,2, поэтому почти в 5 раз плотнее!
Функция spreadPoints () могла бы работать лучше, но я не уверен.
В вашем JavaScript есть пара ошибок - использование pow (.., -1) функция вместо acos () смешивает углы и пропускает объект Math для вызова random ().
Здесь аналогичный, но правильный JavaScript для выполнения того, что говорит ссылка Wolfram:
/*
Returns a random point of a sphere, evenly distributed over the sphere.
The sphere is centered at (x0,y0,z0) with the passed in radius.
The returned point is returned as a three element array [x,y,z].
*/
function randomSpherePoint(x0,y0,z0,radius){
var u = Math.random();
var v = Math.random();
var theta = 2 * Math.PI * u;
var phi = Math.acos(2 * v - 1);
var x = x0 + (radius * Math.sin(phi) * Math.cos(theta));
var y = y0 + (radius * Math.sin(phi) * Math.sin(theta));
var z = z0 + (radius * Math.cos(phi));
return [x,y,z];
}