39 #ifndef BIVARIATE_POLYNOMIAL_HPP
40 #define BIVARIATE_POLYNOMIAL_HPP
43 template<
typename real>
45 degree(0), parameters(NULL), gradient_x(NULL), gradient_y(NULL)
51 template<
typename real>
53 degree(0), parameters(NULL), gradient_x(NULL), gradient_y(NULL)
59 template<
typename real>
66 template<
typename real>
void
75 int oldDegree = degree;
77 if (oldDegree != degree)
80 parameters =
new real[getNoOfParameters ()];
82 delete gradient_x; gradient_x = NULL;
83 delete gradient_y; gradient_y = NULL;
87 template<
typename real>
void
90 delete[] parameters; parameters = NULL;
91 delete gradient_x; gradient_x = NULL;
92 delete gradient_y; gradient_y = NULL;
96 template<
typename real>
void
99 if (
this == &other)
return;
100 if (degree != other.
degree)
104 parameters =
new real[getNoOfParameters ()];
108 delete gradient_x; gradient_x=NULL;
109 delete gradient_y; gradient_y=NULL;
111 else if (gradient_x==NULL)
116 real* tmpParameters1 = parameters;
117 const real* tmpParameters2 = other.
parameters;
118 unsigned int noOfParameters = getNoOfParameters ();
119 for (
unsigned int i=0; i<noOfParameters; i++)
120 *tmpParameters1++ = *tmpParameters2++;
130 template<
typename real>
void
133 if (gradient_x!=NULL && !forceRecalc)
135 if (gradient_x == NULL)
137 if (gradient_y == NULL)
140 unsigned int parameterPosDx=0, parameterPosDy=0;
141 for (
int xDegree=degree; xDegree>=0; xDegree--)
143 for (
int yDegree=degree-xDegree; yDegree>=0; yDegree--)
147 gradient_x->
parameters[parameterPosDx] = xDegree * parameters[parameterPosDx];
152 gradient_y->
parameters[parameterPosDy] = yDegree * parameters[ ( (degree+2-xDegree)* (degree+1-xDegree))/2 -
161 template<
typename real> real
164 unsigned int parametersSize = getNoOfParameters ();
165 real* tmpParameter = ¶meters[parametersSize-1];
166 real tmpX=1.0, tmpY, ret=0;
167 for (
int xDegree=0; xDegree<=degree; xDegree++)
170 for (
int yDegree=0; yDegree<=degree-xDegree; yDegree++)
172 ret += (*tmpParameter)*tmpX*tmpY;
182 template<
typename real>
void
185 calculateGradient ();
186 gradX = gradient_x->getValue (x, y);
187 gradY = gradient_y->getValue (x, y);
191 template<
typename real>
void
193 std::vector<int>& types)
const
201 real x = (real(2)*parameters[2]*parameters[3] - parameters[1]*parameters[4]) /
202 (parameters[1]*parameters[1] - real(4)*parameters[0]*parameters[3]),
203 y = (real(-2)*parameters[0]*x - parameters[2]) / parameters[1];
205 if (!pcl_isfinite(x) || !pcl_isfinite(y))
209 real det_H = real(4)*parameters[0]*parameters[3] - parameters[1]*parameters[1];
213 if (parameters[0]+parameters[3] < real(0))
218 x_values.push_back(x);
219 y_values.push_back(y);
220 types.push_back(type);
224 std::cerr << __PRETTY_FUNCTION__ <<
" is not implemented for polynomials of degree "<<degree<<
". Sorry.\n";
229 template<
typename real> std::ostream&
230 pcl::operator<< (std::ostream& os, const pcl::BivariatePolynomialT<real>& p)
232 real* tmpParameter = p.parameters;
234 real currentParameter;
235 for (
int xDegree=p.degree; xDegree>=0; xDegree--)
237 for (
int yDegree=p.degree-xDegree; yDegree>=0; yDegree--)
239 currentParameter = *tmpParameter;
242 os << (currentParameter<0.0?
" - ":
" + ");
243 currentParameter = fabs (currentParameter);
245 os << currentParameter;
267 template<
typename real>
void
270 os.write (reinterpret_cast<char*> (°ree),
sizeof (
int));
271 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
272 os.write (reinterpret_cast<char*> (this->parameters), paramCnt *
sizeof (real));
276 template<
typename real>
void
279 std::ofstream fout (filename);
284 template<
typename real>
void
288 os.read (reinterpret_cast<char*> (&this->degree),
sizeof (
int));
289 unsigned int paramCnt = getNoOfParametersFromDegree (this->degree);
290 parameters =
new real[paramCnt];
291 os.read (reinterpret_cast<char*> (&(*this->parameters)), paramCnt *
sizeof (real));
295 template<
typename real>
void
298 std::ifstream fin (filename);