39 #ifndef BIVARIATE_POLYNOMIAL_HPP
40 #define BIVARIATE_POLYNOMIAL_HPP
45 template<
typename real>
47 degree(0), parameters(nullptr), gradient_x(nullptr), gradient_y(nullptr)
53 template<
typename real>
55 degree(0), parameters(NULL), gradient_x(NULL), gradient_y(NULL)
61 template<
typename real>
68 template<
typename real>
void
77 int oldDegree = degree;
79 if (oldDegree != degree)
82 parameters =
new real[getNoOfParameters ()];
84 delete gradient_x; gradient_x =
nullptr;
85 delete gradient_y; gradient_y =
nullptr;
89 template<
typename real>
void
92 delete[] parameters; parameters =
nullptr;
93 delete gradient_x; gradient_x =
nullptr;
94 delete gradient_y; gradient_y =
nullptr;
98 template<
typename real>
void
101 if (
this == &other)
return;
102 if (degree != other.
degree)
106 parameters =
new real[getNoOfParameters ()];
110 delete gradient_x; gradient_x=NULL;
111 delete gradient_y; gradient_y=NULL;
113 else if (gradient_x==NULL)
119 std::copy_n(other.
parameters, getNoOfParameters (), parameters);
129 template<
typename real>
void
132 if (gradient_x!=NULL && !forceRecalc)
return;
134 if (gradient_x == NULL)
136 if (gradient_y == NULL)
139 unsigned int parameterPosDx=0, parameterPosDy=0;
140 for (
int xDegree=degree; xDegree>=0; xDegree--)
142 for (
int yDegree=degree-xDegree; yDegree>=0; yDegree--)
146 gradient_x->parameters[parameterPosDx] = xDegree * parameters[parameterPosDx];
151 gradient_y->parameters[parameterPosDy] = yDegree * parameters[ ( (degree+2-xDegree)* (degree+1-xDegree))/2 -
160 template<
typename real> real
163 unsigned int parametersSize = getNoOfParameters ();
164 real* tmpParameter = ¶meters[parametersSize-1];
165 real tmpX=1.0, tmpY, ret=0;
166 for (
int xDegree=0; xDegree<=degree; xDegree++)
169 for (
int yDegree=0; yDegree<=degree-xDegree; yDegree++)
171 ret += (*tmpParameter)*tmpX*tmpY;
181 template<
typename real>
void
184 calculateGradient ();
185 gradX = gradient_x->getValue (x, y);
186 gradY = gradient_y->getValue (x, y);
190 template<
typename real>
void
192 std::vector<int>& types)
const
200 real x = (real(2)*parameters[2]*parameters[3] - parameters[1]*parameters[4]) /
201 (parameters[1]*parameters[1] - real(4)*parameters[0]*parameters[3]),
202 y = (real(-2)*parameters[0]*x - parameters[2]) / parameters[1];
204 if (!std::isfinite(x) || !std::isfinite(y))
208 real det_H = real(4)*parameters[0]*parameters[3] - parameters[1]*parameters[1];
212 if (parameters[0]+parameters[3] < real(0))
217 x_values.push_back(x);
218 y_values.push_back(y);
219 types.push_back(type);
223 std::cerr << __PRETTY_FUNCTION__ <<
" is not implemented for polynomials of degree "<<degree<<
". Sorry.\n";
228 template<
typename real> std::ostream&
233 real currentParameter;
234 for (
int xDegree=p.
degree; xDegree>=0; xDegree--)
236 for (
int yDegree=p.
degree-xDegree; yDegree>=0; yDegree--)
238 currentParameter = *tmpParameter;
241 os << (currentParameter<0.0?
" - ":
" + ");
242 currentParameter = std::abs (currentParameter);
244 os << currentParameter;
266 template<
typename real>
void
269 os.write (reinterpret_cast<char*> (°ree),
sizeof (
int));
270 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
271 os.write (reinterpret_cast<char*> (this->parameters), paramCnt *
sizeof (real));
275 template<
typename real>
void
278 std::ofstream fout (filename);
283 template<
typename real>
void
287 os.read (reinterpret_cast<char*> (&this->degree),
sizeof (
int));
288 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
289 parameters =
new real[paramCnt];
290 os.read (reinterpret_cast<char*> (&(*this->parameters)), paramCnt *
sizeof (real));
294 template<
typename real>
void
297 std::ifstream fin (filename);