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>
59 template<
typename real>
66 template<
typename real>
void 87 template<
typename real>
void 96 template<
typename real>
void 99 if (
this == &other)
return;
117 const real* tmpParameters2 = other.
parameters;
119 for (
unsigned int i=0; i<noOfParameters; i++)
120 *tmpParameters1++ = *tmpParameters2++;
130 template<
typename real>
void 140 unsigned int parameterPosDx=0, parameterPosDy=0;
141 for (
int xDegree=
degree; xDegree>=0; xDegree--)
143 for (
int yDegree=
degree-xDegree; yDegree>=0; yDegree--)
161 template<
typename real> real
165 real* tmpParameter = &
parameters[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 191 template<
typename real>
void 193 std::vector<int>& types)
const 205 if (!pcl_isfinite(x) || !pcl_isfinite(y))
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*> (&
degree),
sizeof (
int));
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));
291 os.read (reinterpret_cast<char*> (&(*this->
parameters)), paramCnt *
sizeof (real));
295 template<
typename real>
void 298 std::ifstream fin (filename);
This represents a bivariate polynomial and provides some functionality for it.
void findCriticalPoints(std::vector< real > &x_values, std::vector< real > &y_values, std::vector< int > &types) const
Returns critical points of the polynomial.
~BivariatePolynomialT()
Destructor.
void calculateGradient(bool forceRecalc=false)
Calculate the gradient of this polynomial If forceRecalc is false, it will do nothing when the gradie...
BivariatePolynomialT< real > * gradient_x
void memoryCleanUp()
Delete all members.
void deepCopy(const BivariatePolynomialT< real > &other)
Create a deep copy of the given polynomial.
void writeBinary(std::ostream &os) const
write as binary to a stream
BivariatePolynomialT< real > * gradient_y
real getValue(real x, real y) const
Calculate the value of the polynomial at the given point.
void setDegree(int new_degree)
Initialize members to default values.
BivariatePolynomialT(int new_degree=0)
Constructor.
void readBinary(std::istream &os)
read binary from a stream
static unsigned int getNoOfParametersFromDegree(int n)
How many parameters has a bivariate polynomial of the given degree.
unsigned int getNoOfParameters() const
How many parameters has a bivariate polynomial with this degree.
void getValueOfGradient(real x, real y, real &gradX, real &gradY)
Calculate the value of the gradient at the given point.