39 #ifndef BIVARIATE_POLYNOMIAL_HPP
40 #define BIVARIATE_POLYNOMIAL_HPP
49 template<
typename real>
51 degree(0), parameters(nullptr), gradient_x(nullptr), gradient_y(nullptr)
57 template<
typename real>
59 degree(0), parameters(NULL), gradient_x(NULL), gradient_y(NULL)
65 template<
typename real>
72 template<
typename real>
void
81 int oldDegree = degree;
83 if (oldDegree != degree)
86 parameters =
new real[getNoOfParameters ()];
88 delete gradient_x; gradient_x =
nullptr;
89 delete gradient_y; gradient_y =
nullptr;
93 template<
typename real>
void
96 delete[] parameters; parameters =
nullptr;
97 delete gradient_x; gradient_x =
nullptr;
98 delete gradient_y; gradient_y =
nullptr;
102 template<
typename real>
void
105 if (
this == &other)
return;
106 if (degree != other.
degree)
110 parameters =
new real[getNoOfParameters ()];
114 delete gradient_x; gradient_x=NULL;
115 delete gradient_y; gradient_y=NULL;
117 else if (gradient_x==NULL)
123 std::copy_n(other.
parameters, getNoOfParameters (), parameters);
133 template<
typename real>
void
136 if (gradient_x!=NULL && !forceRecalc)
return;
138 if (gradient_x == NULL)
140 if (gradient_y == NULL)
143 unsigned int parameterPosDx=0, parameterPosDy=0;
144 for (
int xDegree=degree; xDegree>=0; xDegree--)
146 for (
int yDegree=degree-xDegree; yDegree>=0; yDegree--)
150 gradient_x->parameters[parameterPosDx] = xDegree * parameters[parameterPosDx];
155 gradient_y->parameters[parameterPosDy] = yDegree * parameters[ ( (degree+2-xDegree)* (degree+1-xDegree))/2 -
164 template<
typename real> real
167 unsigned int parametersSize = getNoOfParameters ();
168 real* tmpParameter = ¶meters[parametersSize-1];
169 real tmpX=1.0, tmpY, ret=0;
170 for (
int xDegree=0; xDegree<=degree; xDegree++)
173 for (
int yDegree=0; yDegree<=degree-xDegree; yDegree++)
175 ret += (*tmpParameter)*tmpX*tmpY;
185 template<
typename real>
void
188 calculateGradient ();
189 gradX = gradient_x->getValue (x, y);
190 gradY = gradient_y->getValue (x, y);
194 template<
typename real>
void
196 std::vector<int>& types)
const
204 real x = (real(2)*parameters[2]*parameters[3] - parameters[1]*parameters[4]) /
205 (parameters[1]*parameters[1] - real(4)*parameters[0]*parameters[3]),
206 y = (real(-2)*parameters[0]*x - parameters[2]) / parameters[1];
208 if (!std::isfinite(x) || !std::isfinite(y))
212 real det_H = real(4)*parameters[0]*parameters[3] - parameters[1]*parameters[1];
216 if (parameters[0]+parameters[3] < real(0))
221 x_values.push_back(x);
222 y_values.push_back(y);
223 types.push_back(type);
227 std::cerr << __PRETTY_FUNCTION__ <<
" is not implemented for polynomials of degree "<<degree<<
". Sorry.\n";
232 template<
typename real> std::ostream&
237 real currentParameter;
238 for (
int xDegree=p.
degree; xDegree>=0; xDegree--)
240 for (
int yDegree=p.
degree-xDegree; yDegree>=0; yDegree--)
242 currentParameter = *tmpParameter;
245 os << (currentParameter<0.0?
" - ":
" + ");
246 currentParameter = std::abs (currentParameter);
248 os << currentParameter;
270 template<
typename real>
void
273 os.write (
reinterpret_cast<const char*
> (°ree),
sizeof (
int));
274 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
275 os.write (
reinterpret_cast<const char*
> (this->parameters), paramCnt *
sizeof (real));
279 template<
typename real>
void
282 std::ofstream fout (filename);
287 template<
typename real>
void
291 os.read (
reinterpret_cast<char*
> (&this->degree),
sizeof (
int));
292 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
293 parameters =
new real[paramCnt];
294 os.read (
reinterpret_cast<char*
> (&(*this->parameters)), paramCnt *
sizeof (real));
298 template<
typename real>
void
301 std::ifstream fin (filename);