72 numberOfAxisBins -= 1;
76 if (numberOfAxisBins < 4) {
80 std::vector<int32_t> vKnotBins;
84 int32_t lastBin = numberOfAxisBins;
86 vKnotBins.push_back(0);
88 for (int32_t
i = 0;
i < numberOfKnots; ++
i) {
89 int32_t bin = (int32_t)roundf(inputKnots[
i] * numberOfAxisBins);
90 if (bin <= vKnotBins.back() || bin >= lastBin) {
93 vKnotBins.push_back(bin);
96 vKnotBins.push_back(lastBin);
98 if (vKnotBins.size() < 5) {
100 vKnotBins.push_back(0);
101 vKnotBins.push_back((int32_t)roundf(0.25 * numberOfAxisBins));
102 vKnotBins.push_back((int32_t)roundf(0.50 * numberOfAxisBins));
103 vKnotBins.push_back((int32_t)roundf(0.75 * numberOfAxisBins));
104 vKnotBins.push_back(lastBin);
108 mNumberOfKnots = vKnotBins.size();
109 mNumberOfAxisBins = numberOfAxisBins;
116 for (int32_t
i = 0;
i < mNumberOfKnots;
i++) {
117 s[
i].u = vKnotBins[
i] / ((double)mNumberOfAxisBins);
122 double du = (s[
i + 1].u - s[
i].u);
123 double x3 = (s[
i + 2].u - s[
i].u) / du;
124 s[
i].scale = 1. / du;
127 s[
i].scaleR2 = (x3 - 2.) / (x3 - 1.);
128 s[
i].scaleR3 = 1. / (x3 * (x3 - 1.));
131 for (int32_t
i = 1;
i < mNumberOfKnots - 2;
i++) {
132 double du = (s[
i + 1].u - s[
i].u);
133 double x0 = (s[
i - 1].u - s[
i].u) / du;
134 double x3 = (s[
i + 2].u - s[
i].u) / du;
135 s[
i].scale = 1. / du;
136 s[
i].scaleL0 = -1. / (
x0 * (
x0 - 1.));
137 s[
i].scaleL2 =
x0 / (
x0 - 1.);
138 s[
i].scaleR2 = (x3 - 2.) / (x3 - 1.);
139 s[
i].scaleR3 = 1. / (x3 * (x3 - 1.));
143 int32_t
i = mNumberOfKnots - 2;
144 double du = (s[
i + 1].u - s[
i].u);
145 double x0 = (s[
i - 1].u - s[
i].u) / du;
146 s[
i].scale = 1. / du;
147 s[
i].scaleL0 = -1. / (
x0 * (
x0 - 1.));
148 s[
i].scaleL2 =
x0 / (
x0 - 1.);
154 int32_t
i = mNumberOfKnots - 1;
164 int32_t* map = getBin2KnotMapNonConst();
166 int32_t iKnotMin = 1;
167 int32_t iKnotMax = mNumberOfKnots - 3;
179 for (int32_t iBin = 0, iKnot = iKnotMin; iBin <= mNumberOfAxisBins; iBin++) {
180 if ((iKnot < iKnotMax) && vKnotBins[iKnot + 1] == iBin) {