70 numberOfAxisBins -= 1;
74 if (numberOfAxisBins < 4) {
78 std::vector<int32_t> vKnotBins;
82 int32_t lastBin = numberOfAxisBins;
84 vKnotBins.push_back(0);
86 for (int32_t
i = 0;
i < numberOfKnots; ++
i) {
87 int32_t bin = (int32_t)roundf(inputKnots[
i] * numberOfAxisBins);
88 if (bin <= vKnotBins.back() || bin >= lastBin) {
91 vKnotBins.push_back(bin);
94 vKnotBins.push_back(lastBin);
96 if (vKnotBins.size() < 5) {
98 vKnotBins.push_back(0);
99 vKnotBins.push_back((int32_t)roundf(0.25 * numberOfAxisBins));
100 vKnotBins.push_back((int32_t)roundf(0.50 * numberOfAxisBins));
101 vKnotBins.push_back((int32_t)roundf(0.75 * numberOfAxisBins));
102 vKnotBins.push_back(lastBin);
106 mNumberOfKnots = vKnotBins.size();
107 mNumberOfAxisBins = numberOfAxisBins;
114 for (int32_t
i = 0;
i < mNumberOfKnots;
i++) {
115 s[
i].u = vKnotBins[
i] / ((double)mNumberOfAxisBins);
120 double du = (s[
i + 1].u - s[
i].u);
121 double x3 = (s[
i + 2].u - s[
i].u) / du;
122 s[
i].scale = 1. / du;
125 s[
i].scaleR2 = (x3 - 2.) / (x3 - 1.);
126 s[
i].scaleR3 = 1. / (x3 * (x3 - 1.));
129 for (int32_t
i = 1;
i < mNumberOfKnots - 2;
i++) {
130 double du = (s[
i + 1].u - s[
i].u);
131 double x0 = (s[
i - 1].u - s[
i].u) / du;
132 double x3 = (s[
i + 2].u - s[
i].u) / du;
133 s[
i].scale = 1. / du;
134 s[
i].scaleL0 = -1. / (
x0 * (
x0 - 1.));
135 s[
i].scaleL2 =
x0 / (
x0 - 1.);
136 s[
i].scaleR2 = (x3 - 2.) / (x3 - 1.);
137 s[
i].scaleR3 = 1. / (x3 * (x3 - 1.));
141 int32_t
i = mNumberOfKnots - 2;
142 double du = (s[
i + 1].u - s[
i].u);
143 double x0 = (s[
i - 1].u - s[
i].u) / du;
144 s[
i].scale = 1. / du;
145 s[
i].scaleL0 = -1. / (
x0 * (
x0 - 1.));
146 s[
i].scaleL2 =
x0 / (
x0 - 1.);
152 int32_t
i = mNumberOfKnots - 1;
162 int32_t* map = getBin2KnotMapNonConst();
164 int32_t iKnotMin = 1;
165 int32_t iKnotMax = mNumberOfKnots - 3;
177 for (int32_t iBin = 0, iKnot = iKnotMin; iBin <= mNumberOfAxisBins; iBin++) {
178 if ((iKnot < iKnotMax) && vKnotBins[iKnot + 1] == iBin) {