www.pudn.com > ReadingPeopleTracker-1.28.rar > SplineWeights.cc
/***************************************************************
* C++ source
*
* File : SplineWeights.cc
*
* Module : SplineWeights
*
* Author : A M Baumberg
*
* Creation Date : Tue Jan 11 16:21:52 1994
*
* Comments :
*
***************************************************************/
#include "SplineWeights.h"
namespace ReadingPeopleTracker
{
// definition and initialisation of static member variables
const unsigned int SplineWeights::NO_SUBDIVISIONS = 2;
// void SplineWeights::setup_spline_weights()
// {
// if (spline_weights == NULL)
// spline_weights = new SplineWeights();
// }
realno SplineWeights::B_func(int i, realno u)
{
u -= (i-2);
if (u < 0) u += Profile::NO_CONTROL_POINTS;
else if (u >= Profile::NO_CONTROL_POINTS) u -= Profile::NO_CONTROL_POINTS;
realno v = u - ((int) u);
if (u >= 4) return 0;
else if (u < 1) return (v * v * v) / 6;
else if (u < 2) return ((1 + 3 * v * (1 + v * ( 1 - v))) / 6);
else if (u < 3) return (4 + 3 * v * v * ( v - 2 ))/6;
else return ((1 + v * (3 * (v - 1) - v * v)) / 6);
}
realno SplineWeights::dB_func(int i, realno u)
{
u -= (i-2);
if (u < 0) u += Profile::NO_CONTROL_POINTS;
else if (u >= Profile::NO_CONTROL_POINTS) u -= Profile::NO_CONTROL_POINTS;
realno v = u - ((int) u);
if (u >= 4) return 0;
else if (u < 1) return (v * v) / 2;
else if (u < 2) return (1 + 2 * v - 3 * v * v) / 2;
else if (u < 3) return (3 * v * v - 4 * v) / 2;
else return (-1 + 2 * v - v * v) / 2;
}
realno SplineWeights::ddB_func(int i, realno u)
{
u -= (i-2);
if (u < 0) u += Profile::NO_CONTROL_POINTS;
else if (u >= Profile::NO_CONTROL_POINTS) u -= Profile::NO_CONTROL_POINTS;
realno v = u - ((int) u);
if (u >= 4) return 0;
else if (u < 1) return v;
else if (u < 2) return 1 - 3 * v;
else if (u < 3) return 3 * v - 2;
else return 1 - v;
}
SplineWeights::SplineWeights(unsigned int n)
{
if (n == 0)
nsubs = NO_SUBDIVISIONS;
else
nsubs = n;
realno step = 1.0 / (realno) n; realno u = 0;
w0 = new realno[n];
w1 = new realno[n];
w2 = new realno[n];
w3 = new realno[n];
dw0 = new realno[n];
dw1 = new realno[n];
dw2 = new realno[n];
dw3 = new realno[n];
for (int i = 0; i < n; i++)
{
w0[i] = B_func(-1,u);
w1[i] = B_func(0,u);
w2[i] = B_func(1,u);
w3[i] = B_func(2,u);
dw0[i] = dB_func(-1,u);
dw1[i] = dB_func(0,u);
dw2[i] = dB_func(1,u);
dw3[i] = dB_func(2,u);
u += step;
}
}
} // namespace ReadingPeopleTracker