31template<
unsigned int cGr
ids,
unsigned int cPo
ints>
32class cSpline :
public Class
36 float m_vPoints[cPoints][cGrids];
37 int m_iPointFlags[cPoints];
42 int Add(
float *fAdd,
int flags);
43 void Modify(
int,
float *,
int);
44 void UniformAdd(
float *pos);
45 void Remove(
class cSpline<cGrids, cPoints> *,
int);
46 void RemoveRange(
int,
int);
48 float *Get(
float x,
int *flags);
49 float *GetByNode(
float x,
int *flags);
50 int Append(cSpline<cGrids, cPoints> *pNew);
55template<
unsigned int cGr
ids,
unsigned int cPo
ints>
56cSpline<cGrids, cPoints>::cSpline()
61template<
unsigned int cGr
ids,
unsigned int cPo
ints>
62void cSpline<cGrids, cPoints>::Archive(
Archiver& arc)
64 arc.ArchiveInteger(&m_iPoints);
66 for (
int i = 0; i < cPoints; i++) {
67 for (
int j = 0; j < cGrids; j++) {
68 arc.ArchiveFloat(&m_vPoints[i][j]);
71 arc.ArchiveInteger(&m_iPointFlags[i]);
75template<
unsigned int cGr
ids,
unsigned int cPo
ints>
76void cSpline<cGrids, cPoints>::Reset(
void)
81template<
unsigned int cGr
ids,
unsigned int cPo
ints>
82int cSpline<cGrids, cPoints>::Add(
float *fAdd,
int flags)
88 if (m_iPoints + 1 > cPoints) {
92 insertIndex = Right(*fAdd);
94 for (i = m_iPoints; i > insertIndex; i--) {
95 for (ii = 0; ii < cGrids; ii++) {
96 m_vPoints[i][ii] = m_vPoints[i - 1][ii];
99 m_iPointFlags[i] = m_iPointFlags[i - 1];
102 for (i = 0; i < cGrids; i++) {
103 m_vPoints[insertIndex][i] = fAdd[i];
106 m_iPointFlags[insertIndex] = flags;
112template<
unsigned int cGr
ids,
unsigned int cPo
ints>
113void cSpline<cGrids, cPoints>::UniformAdd(
float *pos)
118 for (i = 0; i < m_iPoints; i++) {
119 for (ii = 0; ii < cGrids; ii++) {
120 m_vPoints[i][ii] += pos[ii];
125template<
unsigned int cGr
ids,
unsigned int cPo
ints>
126int cSpline<cGrids, cPoints>::Right(
float x)
130 for (i = 0; i < m_iPoints; i++) {
131 if (m_vPoints[i][0] > x) {
139template<
unsigned int cGr
ids,
unsigned int cPo
ints>
140float *cSpline<cGrids, cPoints>::Get(
float x,
int *flags)
148 static float r[cGrids];
149 double delta[cGrids];
154 if (rp == m_iPoints) {
156 *flags = m_iPointFlags[rp - 1];
159 for (i = 0; i < cGrids; i++) {
160 r[i] = m_vPoints[rp - 1][i];
164 *flags = m_iPointFlags[rp - 1];
167 for (i = 0; i < cGrids; i++) {
168 delta[i] = m_vPoints[rp][i] - m_vPoints[rp - 1][i];
171 for (i = 0; i < cGrids; i++) {
172 r[i] = (x - m_vPoints[rp - 1][0]) / delta[0] * delta[i] + m_vPoints[rp - 1][i];
177 *flags = m_iPointFlags[0];
180 for (i = 0; i < cGrids; i++) {
181 r[i] = m_vPoints[0][i];
188template<
unsigned int cGr
ids,
unsigned int cPo
ints>
189float *cSpline<cGrids, cPoints>::GetByNode(
float x,
int *flags)
197 static float r[cGrids];
198 double delta[cGrids];
200 rp = (int)(floor(x) + 1.0);
204 *flags = m_iPointFlags[0];
207 for (i = 0; i < cGrids; i++) {
208 r[i] = m_vPoints[0][i];
210 }
else if (rp < m_iPoints) {
212 *flags = m_iPointFlags[rp - 1];
215 for (i = 0; i < cGrids; i++) {
216 delta[i] = m_vPoints[rp][i] - m_vPoints[rp - 1][i];
219 for (i = 0; i < cGrids; i++) {
220 r[i] = (x - (rp - 1)) * delta[i] + m_vPoints[rp - 1][i];
224 *flags = m_iPointFlags[m_iPoints - 1];
227 for (i = 0; i < cGrids; i++) {
228 r[i] = m_vPoints[m_iPoints - 1][i];
235template<
unsigned int cGr
ids,
unsigned int cPo
ints>
245 if (!pNew || pNew->m_iPoints == 0) {
253 fIndexAdd = *GetByNode(m_iPoints, NULL);
255 for (i = 0; i < pNew->m_iPoints; i++) {
256 i_fTmp = pNew->GetByNode(i, &iFlags);
258 for (ii = 0; ii < cGrids; ii++) {
259 o_fTmp[ii] = i_fTmp[ii];
262 o_fTmp[0] += fIndexAdd;
268 for (i = 0; i < pNew->m_iPoints; i++) {
269 i_fTmp = pNew->GetByNode(i, &iFlags);
271 for (ii = 0; ii < cGrids; ii++) {
272 o_fTmp[ii] = i_fTmp[ii];