Point Cloud Library (PCL) 1.15.1-dev
Loading...
Searching...
No Matches
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
46namespace 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 */
68 {
69 if (this == &other)
70 return *this;
71 deepCopy (other);
72 return *this;
73 }
74
75 //-----METHODS-----
76 /** Initialize members to default values */
77 void
78 setDegree (int new_degree);
79
80 /** How many parameters has a bivariate polynomial with this degree */
81 unsigned int
83
84 /** Calculate the value of the polynomial at the given point */
85 real
86 getValue (real x, real y) const;
87
88 /** Calculate the gradient of this polynomial
89 * If forceRecalc is false, it will do nothing when the gradient already exists */
90 void
91 calculateGradient (bool forceRecalc=false);
92
93 /** Calculate the value of the gradient at the given point */
94 void
95 getValueOfGradient (real x, real y, real& gradX, real& gradY);
96
97 /** Returns critical points of the polynomial. type can be 0=maximum, 1=minimum, or 2=saddle point
98 * !!Currently only implemented for degree 2!! */
99 void
100 findCriticalPoints (std::vector<real>& x_values, std::vector<real>& y_values, std::vector<int>& types) const;
101
102 /** write as binary to a stream */
103 void
104 writeBinary (std::ostream& os) const;
105
106 /** write as binary into a file */
107 void
108 writeBinary (const char* filename) const;
109
110 /** read binary from a stream */
111 void
112 readBinary (std::istream& os);
113
114 /** read binary from a file */
115 void
116 readBinary (const char* filename);
117
118 /** How many parameters has a bivariate polynomial of the given degree */
119 static unsigned int
120 getNoOfParametersFromDegree (int n) { return ((n+2)* (n+1))/2;}
121
122 //-----VARIABLES-----
123 int degree{0};
124 real* parameters{nullptr};
127
128 protected:
129 //-----METHODS-----
130 /** Delete all members */
131 void
132 memoryCleanUp ();
133
134 /** Create a deep copy of the given polynomial */
135 void
137 //-----VARIABLES-----
138 };
139
140 template<typename real>
141 std::ostream&
142 operator<< (std::ostream& os, const BivariatePolynomialT<real>& p);
143
146
147} // end namespace
148
149#include <pcl/common/impl/bivariate_polynomial.hpp>
This represents a bivariate polynomial and provides some functionality for it.
BivariatePolynomialT & operator=(const BivariatePolynomialT &other)
= operator
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.
void memoryCleanUp()
Delete all members.
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.
BivariatePolynomialT< float > BivariatePolynomial
std::ostream & operator<<(std::ostream &os, const BivariatePolynomialT< real > &p)
BivariatePolynomialT< double > BivariatePolynomiald