Added an implementation of the Dave Rusin’s Disco Ball algorithm for the generation of regular points on a sphere.
This commit is contained in:
parent
a90b2a79ef
commit
e6e7999c6c
|
|
@ -77,6 +77,51 @@ static void UniformCone(int vn, std::vector<Point3<ScalarType > > &NN, ScalarTyp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is an Implementation of the Dave Rusin’s Disco Ball algorithm
|
||||||
|
// You can spread the points as follows:
|
||||||
|
// Put N+1 points on the meridian from north to south poles, equally spaced.
|
||||||
|
// If you swing this meridian around the sphere, you'll sweep out the entire
|
||||||
|
// surface; in the process, each of the points will sweep out a circle. You
|
||||||
|
// can show that the ith point will sweep out a circle of radius sin(pi i/N).
|
||||||
|
// If you space points equally far apart on this circle, keeping the
|
||||||
|
// displacement roughly the same as on that original meridian, you'll be
|
||||||
|
// able to fit about 2N sin(pi i/N) points here. This process will put points
|
||||||
|
// pretty evenly spaced on the sphere; the number of such points is about
|
||||||
|
// 2+ 2N*Sum(i=1 to N-1) sin(pi i/N).
|
||||||
|
// The closed form of this summation
|
||||||
|
// 2.0 - ( (2.0*N * sin (M_PI/N))/(cos(M_PI/N) - 1.0));
|
||||||
|
static void Regular(int vn, std::vector<Point3<ScalarType > > &NN)
|
||||||
|
{
|
||||||
|
// Guess the right N
|
||||||
|
ScalarType N=0;
|
||||||
|
|
||||||
|
for(N=1;N<vn;++N)
|
||||||
|
{
|
||||||
|
ScalarType expectedPoints = 2.0 - ( (2.0*N * sin (M_PI/N))/(cos(M_PI/N) - 1.0));
|
||||||
|
qDebug("N %f -> %f",N,expectedPoints);
|
||||||
|
if(expectedPoints >= vn) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ScalarType VerticalAngle = M_PI / N;
|
||||||
|
NN.push_back(Point3<ScalarType>(0,0,1.0));
|
||||||
|
for (int i =1; i<N; ++i)
|
||||||
|
{
|
||||||
|
// Z is the north/south axis
|
||||||
|
ScalarType HorizRadius = sin(i*VerticalAngle);
|
||||||
|
ScalarType CircleLength = 2.0 * M_PI * HorizRadius;
|
||||||
|
ScalarType Z = cos(i*VerticalAngle);
|
||||||
|
ScalarType PointNumPerCircle = floor( CircleLength / VerticalAngle);
|
||||||
|
ScalarType HorizontalAngle = 2.0*M_PI/PointNumPerCircle;
|
||||||
|
for(ScalarType j=0;j<PointNumPerCircle;++j)
|
||||||
|
{
|
||||||
|
ScalarType X = cos(j*HorizontalAngle)*HorizRadius;
|
||||||
|
ScalarType Y = sin(j*HorizontalAngle)*HorizRadius;
|
||||||
|
NN.push_back(Point3<ScalarType>(X,Y,Z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NN.push_back(Point3<ScalarType>(0,0,-1.0));
|
||||||
|
}
|
||||||
|
|
||||||
static void Uniform(int vn, std::vector<Point3<ScalarType > > &NN)
|
static void Uniform(int vn, std::vector<Point3<ScalarType > > &NN)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue