Point Cloud Library (PCL)  1.14.0-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 #include <vector>
45 
46 namespace pcl
47 {
48  /** \brief This represents a bivariate polynomial and provides some functionality for it
49  * \author Bastian Steder
50  * \ingroup common
51  */
52  template<typename real>
54  {
55  public:
56  //-----CONSTRUCTOR&DESTRUCTOR-----
57  /** Constructor */
58  BivariatePolynomialT (int new_degree=0);
59  /** Copy constructor */
61  /** Destructor */
63 
64  //-----OPERATORS-----
65  /** = operator */
67  operator= (const BivariatePolynomialT& other) { deepCopy (other); return *this;}
68 
69  //-----METHODS-----
70  /** Initialize members to default values */
71  void
72  setDegree (int new_degree);
73 
74  /** How many parameters has a bivariate polynomial with this degree */
75  unsigned int
77 
78  /** Calculate the value of the polynomial at the given point */
79  real
80  getValue (real x, real y) const;
81 
82  /** Calculate the gradient of this polynomial
83  * If forceRecalc is false, it will do nothing when the gradient already exists */
84  void
85  calculateGradient (bool forceRecalc=false);
86 
87  /** Calculate the value of the gradient at the given point */
88  void
89  getValueOfGradient (real x, real y, real& gradX, real& gradY);
90 
91  /** Returns critical points of the polynomial. type can be 0=maximum, 1=minimum, or 2=saddle point
92  * !!Currently only implemented for degree 2!! */
93  void
94  findCriticalPoints (std::vector<real>& x_values, std::vector<real>& y_values, std::vector<int>& types) const;
95 
96  /** write as binary to a stream */
97  void
98  writeBinary (std::ostream& os) const;
99 
100  /** write as binary into a file */
101  void
102  writeBinary (const char* filename) const;
103 
104  /** read binary from a stream */
105  void
106  readBinary (std::istream& os);
107 
108  /** read binary from a file */
109  void
110  readBinary (const char* filename);
111 
112  /** How many parameters has a bivariate polynomial of the given degree */
113  static unsigned int
114  getNoOfParametersFromDegree (int n) { return ((n+2)* (n+1))/2;}
115 
116  //-----VARIABLES-----
117  int degree{0};
118  real* parameters{nullptr};
121 
122  protected:
123  //-----METHODS-----
124  /** Delete all members */
125  void
126  memoryCleanUp ();
127 
128  /** Create a deep copy of the given polynomial */
129  void
130  deepCopy (const BivariatePolynomialT<real>& other);
131  //-----VARIABLES-----
132  };
133 
134  template<typename real>
135  std::ostream&
136  operator<< (std::ostream& os, const BivariatePolynomialT<real>& p);
137 
140 
141 } // end namespace
142 
143 #include <pcl/common/impl/bivariate_polynomial.hpp>
This represents a bivariate polynomial and provides some functionality for it.
void deepCopy(const BivariatePolynomialT< real > &other)
Create a deep copy of the given polynomial.
void findCriticalPoints(std::vector< real > &x_values, std::vector< real > &y_values, std::vector< int > &types) const
Returns critical points of the polynomial.
BivariatePolynomialT(int new_degree=0)
Constructor.
void memoryCleanUp()
Delete all members.
BivariatePolynomialT & operator=(const BivariatePolynomialT &other)
= operator
BivariatePolynomialT< real > * gradient_y
void readBinary(std::istream &os)
read binary from a stream
void writeBinary(std::ostream &os) const
write as binary to a stream
real getValue(real x, real y) const
Calculate the value of the polynomial at the given point.
void calculateGradient(bool forceRecalc=false)
Calculate the gradient of this polynomial If forceRecalc is false, it will do nothing when the gradie...
unsigned int getNoOfParameters() const
How many parameters has a bivariate polynomial with this degree.
void setDegree(int new_degree)
Initialize members to default values.
static unsigned int getNoOfParametersFromDegree(int n)
How many parameters has a bivariate polynomial of the given degree.
BivariatePolynomialT< real > * gradient_x
void getValueOfGradient(real x, real y, real &gradX, real &gradY)
Calculate the value of the gradient at the given point.
std::ostream & operator<<(std::ostream &os, const BivariatePolynomialT< real > &p)