Point Cloud Library (PCL)  1.9.1-dev
bivariate_polynomial.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2010-2012, Willow Garage, Inc.
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of the copyright holder(s) nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $Id$
37  *
38  */
39 
40 #pragma once
41 
42 #include <fstream>
43 #include <iostream>
44 
45 namespace pcl
46 {
47  /** \brief This represents a bivariate polynomial and provides some functionality for it
48  * \author Bastian Steder
49  * \ingroup common
50  */
51  template<typename real>
53  {
54  public:
55  //-----CONSTRUCTOR&DESTRUCTOR-----
56  /** Constructor */
57  BivariatePolynomialT (int new_degree=0);
58  /** Copy constructor */
60  /** Destructor */
62 
63  //-----OPERATORS-----
64  /** = operator */
66  operator= (const BivariatePolynomialT& other) { deepCopy (other); return *this;}
67 
68  //-----METHODS-----
69  /** Initialize members to default values */
70  void
71  setDegree (int new_degree);
72 
73  /** How many parameters has a bivariate polynomial with this degree */
74  unsigned int
76 
77  /** Calculate the value of the polynomial at the given point */
78  real
79  getValue (real x, real y) const;
80 
81  /** Calculate the gradient of this polynomial
82  * If forceRecalc is false, it will do nothing when the gradient already exists */
83  void
84  calculateGradient (bool forceRecalc=false);
85 
86  /** Calculate the value of the gradient at the given point */
87  void
88  getValueOfGradient (real x, real y, real& gradX, real& gradY);
89 
90  /** Returns critical points of the polynomial. type can be 0=maximum, 1=minimum, or 2=saddle point
91  * !!Currently only implemented for degree 2!! */
92  void
93  findCriticalPoints (std::vector<real>& x_values, std::vector<real>& y_values, std::vector<int>& types) const;
94 
95  /** write as binary to a stream */
96  void
97  writeBinary (std::ostream& os) const;
98 
99  /** write as binary into a file */
100  void
101  writeBinary (const char* filename) const;
102 
103  /** read binary from a stream */
104  void
105  readBinary (std::istream& os);
106 
107  /** read binary from a file */
108  void
109  readBinary (const char* filename);
110 
111  /** How many parameters has a bivariate polynomial of the given degree */
112  static unsigned int
113  getNoOfParametersFromDegree (int n) { return ((n+2)* (n+1))/2;}
114 
115  //-----VARIABLES-----
116  int degree;
117  real* parameters;
119 
120  protected:
121  //-----METHODS-----
122  /** Delete all members */
123  void
124  memoryCleanUp ();
125 
126  /** Create a deep copy of the given polynomial */
127  void
128  deepCopy (const BivariatePolynomialT<real>& other);
129  //-----VARIABLES-----
130  };
131 
132  template<typename real>
133  std::ostream&
134  operator<< (std::ostream& os, const BivariatePolynomialT<real>& p);
135 
138 
139 } // end namespace
140 
141 #include <pcl/common/impl/bivariate_polynomial.hpp>
This represents a bivariate polynomial and provides some functionality for it.
void calculateGradient(bool forceRecalc=false)
Calculate the gradient of this polynomial If forceRecalc is false, it will do nothing when the gradie...
This file defines compatibility wrappers for low level I/O functions.
Definition: convolution.h:44
BivariatePolynomialT< real > * gradient_x
void memoryCleanUp()
Delete all members.
void deepCopy(const BivariatePolynomialT< real > &other)
Create a deep copy of the given polynomial.
BivariatePolynomialT< real > * gradient_y
unsigned int getNoOfParameters() const
How many parameters has a bivariate polynomial with this degree.
void findCriticalPoints(std::vector< real > &x_values, std::vector< real > &y_values, std::vector< int > &types) const
Returns critical points of the polynomial.
BivariatePolynomialT< float > BivariatePolynomial
void writeBinary(std::ostream &os) const
write as binary to a stream
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
real getValue(real x, real y) const
Calculate the value of the polynomial at the given point.
BivariatePolynomialT & operator=(const BivariatePolynomialT &other)
= operator
static unsigned int getNoOfParametersFromDegree(int n)
How many parameters has a bivariate polynomial of the given degree.
BivariatePolynomialT< double > BivariatePolynomiald
void getValueOfGradient(real x, real y, real &gradX, real &gradY)
Calculate the value of the gradient at the given point.