I'm assuming you are using Boost 1.49. The method below works in that case.
This is where Boost is a little complicated. The object that is uniform_on_sphere
is just one component of what you need in order to draw points, it is the distribution part.. You also need to create a boost::variate_generator
along the lines of the following working .cpp file below.
Note, this has my own includes for using the system time to seed, etc. You should be able to modify this to suit you.
// Standards, w/ctime to seed based on system time.
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
// Boost. Requires variate_generator to actually draw the values.
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_on_sphere.hpp>
#include <boost/random/variate_generator.hpp>
int main(){
typedef boost::random::mt19937 gen_type;
// You can seed this your way as well, but this is my quick and dirty way.
gen_type rand_gen;
rand_gen.seed(static_cast<unsigned int>(std::time(0)));
// Create the distribution object.
boost::uniform_on_sphere<float> unif_sphere(3);
// This is what will actually supply drawn values.
boost::variate_generator<gen_type&, boost::uniform_on_sphere<float> > random_on_sphere(rand_gen, unif_sphere);
// Now you can draw a vector of drawn coordinates as such:
std::vector<float> random_sphere_point = random_on_sphere();
// Print out the drawn sphere triple's values.
for(int i = 0; i < random_sphere_point.size(); ++i) {
std::cout << random_sphere_point.at(i) << ' ';
}
std::cout << '\n';
return 0;
}
When I run this in the console, I get seemingly correct stuff:
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ g++ -I /usr/include/boost_1_49/ -L /usr/include/boost_1_49/stage/lib randomOnSphere.cpp -o ros
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros
0.876326 -0.0441729 0.479689
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros
-0.039037 -0.17792 0.98327
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros
-0.896734 0.419589 -0.14076