Boost logo

Boost :

From: Lewis Hyatt (lhyatt_at_[hidden])
Date: 2007-06-05 16:53:15


Henrik Sundberg wrote:
> I doubt that the trig-version gives a good distribution:
>
> inlineVectortrig(uniform_01<generator_type>&random) {
> constfloatphi=2*M_PI*random();
> constfloatcos_theta=2*random()-1;
> constfloatsin_theta=sqrt(1-cos_theta*cos_theta);
> returnVector(cos_theta,sin_theta*cos(phi),sin_theta *sin(phi));
> }
>
> The result ought to be more dense at the poles.

The posted trig method is correct, it chooses a horizontal cutting plane
uniformly. You can show that the surface area of a sphere contained
between two z-coordinates only depends on the difference between the two
coordinates, not their location, so this generates the correct distribution.

However, the "naive" method is incorrect, the resulting points are not
uniformly distributed over the sphere. The correct version of the
"naive" method is given here:
http://mathworld.wolfram.com/SpherePointPicking.html

-Lewis


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk