void curveInitKnotVector(S_Curve *pCurve) { int size, k, n, m, i; double div, step; IZG_ASSERT(pCurve); /* parametry krivky, pocet ridicich bodu, apod. */ size = cvecSize(pCurve->points); k = pCurve->degree; n = size - 1; m = n + k + 1; IZG_ASSERT(size >= 0 && k >= 2); /* zmena velikosti uzloveho vektoru */ dvecResize(pCurve->knots, m + 1); /* uniformni uzlovy vektor */ div = (double)(m - 2 * k); step = (div == 0.0) ? 0.0 : 1.0 / div; /* prvnich k+1 prvku vektoru je rovno 0 */ for( i = 0; i < k + 1; ++i ) { dvecGet(pCurve->knots, i) = 0.0; } /* zbyvajici cleny vektoru vyplnime konstantim krokem */ for( i = k + 1; i < m - k; ++i ) { dvecGet(pCurve->knots, i) = (i - k) * step; } /* poslednich k+1 prvku vektoru je rovno 1 */ for( i = m - k; i < m + 1; ++i ) { dvecGet(pCurve->knots, i) = 1.0; } }
void curveResize(S_Curve *pCurve, int size, int k) { int i, n; IZG_ASSERT(pCurve && size >= 0 && k >= 2); /* stupen krivky */ pCurve->degree = k; /* zmena velikosti vektoru */ n = cvecSize(pCurve->points); cvecResize(pCurve->points, size); dvecResize(pCurve->weights, size); /* inicializace novych dat */ for( i = n; i < size; ++i ) { cvecGet(pCurve->points, i) = makeCoords(0.0, 0.0, 0.0); dvecGet(pCurve->weights, i) = 1.0; } /* inicializace uzloveho vektoru */ curveInitKnotVector(pCurve); }
int curveSize(S_Curve *pCurve) { IZG_ASSERT(pCurve); return cvecSize(pCurve->points); }
uint32_t vecSize () const { return cvecSize () (); }