Alex Pirciu
/
BFMC
a
include/BezierCurve/polynomialfunction.inl@1:ceee5a608e7c, 2019-03-28 (annotated)
- Committer:
- alexpirciu
- Date:
- Thu Mar 28 07:44:42 2019 +0000
- Revision:
- 1:ceee5a608e7c
assa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alexpirciu | 1:ceee5a608e7c | 1 | |
alexpirciu | 1:ceee5a608e7c | 2 | namespace math{ |
alexpirciu | 1:ceee5a608e7c | 3 | |
alexpirciu | 1:ceee5a608e7c | 4 | /** |
alexpirciu | 1:ceee5a608e7c | 5 | * @brief Construct a new Polynomial Function< T, N>:: Polynomial Function object |
alexpirciu | 1:ceee5a608e7c | 6 | * |
alexpirciu | 1:ceee5a608e7c | 7 | */ |
alexpirciu | 1:ceee5a608e7c | 8 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 9 | PolynomialFunction<T,N>::PolynomialFunction() |
alexpirciu | 1:ceee5a608e7c | 10 | { |
alexpirciu | 1:ceee5a608e7c | 11 | for(int i=0;i<=N;++i){ |
alexpirciu | 1:ceee5a608e7c | 12 | this->coefficients[i]=static_cast<T>(0); |
alexpirciu | 1:ceee5a608e7c | 13 | } |
alexpirciu | 1:ceee5a608e7c | 14 | } |
alexpirciu | 1:ceee5a608e7c | 15 | |
alexpirciu | 1:ceee5a608e7c | 16 | /** |
alexpirciu | 1:ceee5a608e7c | 17 | * @brief Construct a new Polynomial Function< T, N>:: Polynomial Function object |
alexpirciu | 1:ceee5a608e7c | 18 | * |
alexpirciu | 1:ceee5a608e7c | 19 | * @param coefficients The list of the coefficients for the polynomial function. |
alexpirciu | 1:ceee5a608e7c | 20 | */ |
alexpirciu | 1:ceee5a608e7c | 21 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 22 | PolynomialFunction<T,N>::PolynomialFunction(T coefficients[N+1]) |
alexpirciu | 1:ceee5a608e7c | 23 | { |
alexpirciu | 1:ceee5a608e7c | 24 | for(int i=0;i<=N;++i){ |
alexpirciu | 1:ceee5a608e7c | 25 | this->coefficients[i]=coefficients[i]; |
alexpirciu | 1:ceee5a608e7c | 26 | } |
alexpirciu | 1:ceee5a608e7c | 27 | } |
alexpirciu | 1:ceee5a608e7c | 28 | |
alexpirciu | 1:ceee5a608e7c | 29 | /** |
alexpirciu | 1:ceee5a608e7c | 30 | * @brief Destroy the Polynomial Function< T, N>:: Polynomial Function object |
alexpirciu | 1:ceee5a608e7c | 31 | * |
alexpirciu | 1:ceee5a608e7c | 32 | */ |
alexpirciu | 1:ceee5a608e7c | 33 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 34 | PolynomialFunction<T,N>::~PolynomialFunction() |
alexpirciu | 1:ceee5a608e7c | 35 | { |
alexpirciu | 1:ceee5a608e7c | 36 | } |
alexpirciu | 1:ceee5a608e7c | 37 | |
alexpirciu | 1:ceee5a608e7c | 38 | /** |
alexpirciu | 1:ceee5a608e7c | 39 | * @brief Get the degree of the polynomial function |
alexpirciu | 1:ceee5a608e7c | 40 | * |
alexpirciu | 1:ceee5a608e7c | 41 | * @return The degree of the polynom |
alexpirciu | 1:ceee5a608e7c | 42 | */ |
alexpirciu | 1:ceee5a608e7c | 43 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 44 | int32_t PolynomialFunction<T,N>::getDegree() |
alexpirciu | 1:ceee5a608e7c | 45 | { |
alexpirciu | 1:ceee5a608e7c | 46 | return N; |
alexpirciu | 1:ceee5a608e7c | 47 | } |
alexpirciu | 1:ceee5a608e7c | 48 | |
alexpirciu | 1:ceee5a608e7c | 49 | /** |
alexpirciu | 1:ceee5a608e7c | 50 | * @brief Get coefficient value |
alexpirciu | 1:ceee5a608e7c | 51 | * |
alexpirciu | 1:ceee5a608e7c | 52 | * @param index The index of the coefficient |
alexpirciu | 1:ceee5a608e7c | 53 | * @return The value of the coefficient |
alexpirciu | 1:ceee5a608e7c | 54 | */ |
alexpirciu | 1:ceee5a608e7c | 55 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 56 | T PolynomialFunction<T,N>::getCoefficientValue(int32_t index) |
alexpirciu | 1:ceee5a608e7c | 57 | { |
alexpirciu | 1:ceee5a608e7c | 58 | if(index>N || index<0) return static_cast<T>(0); |
alexpirciu | 1:ceee5a608e7c | 59 | return this->coefficients[index]; |
alexpirciu | 1:ceee5a608e7c | 60 | } |
alexpirciu | 1:ceee5a608e7c | 61 | |
alexpirciu | 1:ceee5a608e7c | 62 | /** |
alexpirciu | 1:ceee5a608e7c | 63 | * @brief Set the value of the coefficient |
alexpirciu | 1:ceee5a608e7c | 64 | * |
alexpirciu | 1:ceee5a608e7c | 65 | * @param index The index of the coefficient |
alexpirciu | 1:ceee5a608e7c | 66 | * @param value The new value of the coefficient |
alexpirciu | 1:ceee5a608e7c | 67 | */ |
alexpirciu | 1:ceee5a608e7c | 68 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 69 | void PolynomialFunction<T,N>::setCoefficientValue(int32_t index, T value ){ |
alexpirciu | 1:ceee5a608e7c | 70 | if(index<=N){ |
alexpirciu | 1:ceee5a608e7c | 71 | this->coefficients[index]=value; |
alexpirciu | 1:ceee5a608e7c | 72 | } |
alexpirciu | 1:ceee5a608e7c | 73 | } |
alexpirciu | 1:ceee5a608e7c | 74 | |
alexpirciu | 1:ceee5a608e7c | 75 | /** |
alexpirciu | 1:ceee5a608e7c | 76 | * @brief It sums the polynom with the input polynom and return a result in the new polynom. |
alexpirciu | 1:ceee5a608e7c | 77 | * |
alexpirciu | 1:ceee5a608e7c | 78 | * @param b The input polynom. |
alexpirciu | 1:ceee5a608e7c | 79 | * @return The result polynom. |
alexpirciu | 1:ceee5a608e7c | 80 | */ |
alexpirciu | 1:ceee5a608e7c | 81 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 82 | template<int32_t N2> |
alexpirciu | 1:ceee5a608e7c | 83 | math::PolynomialFunction<T,(N2<N?N:N2)> PolynomialFunction<T,N>::add(PolynomialFunction<T,N2> b){ |
alexpirciu | 1:ceee5a608e7c | 84 | math::PolynomialFunction<T,N2<N?N:N2> p; |
alexpirciu | 1:ceee5a608e7c | 85 | for(int i=0;i<=N2 || i<=N;++i){ |
alexpirciu | 1:ceee5a608e7c | 86 | p.setCoefficientValue(i,this->getCoefficientValue(i)+b.getCoefficientValue(i)); |
alexpirciu | 1:ceee5a608e7c | 87 | } |
alexpirciu | 1:ceee5a608e7c | 88 | return p; |
alexpirciu | 1:ceee5a608e7c | 89 | } |
alexpirciu | 1:ceee5a608e7c | 90 | |
alexpirciu | 1:ceee5a608e7c | 91 | |
alexpirciu | 1:ceee5a608e7c | 92 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 93 | template<int32_t N2> |
alexpirciu | 1:ceee5a608e7c | 94 | /** |
alexpirciu | 1:ceee5a608e7c | 95 | * @brief It multiply the polynom with the given polynom and return the result polynom. |
alexpirciu | 1:ceee5a608e7c | 96 | * |
alexpirciu | 1:ceee5a608e7c | 97 | * @param b The input polynom |
alexpirciu | 1:ceee5a608e7c | 98 | * @return The result polynom |
alexpirciu | 1:ceee5a608e7c | 99 | */ |
alexpirciu | 1:ceee5a608e7c | 100 | math::PolynomialFunction<T,(N2+N)> PolynomialFunction<T,N>::multip(PolynomialFunction<T,N2> b){ |
alexpirciu | 1:ceee5a608e7c | 101 | math::PolynomialFunction<T,(N2+N)> result; |
alexpirciu | 1:ceee5a608e7c | 102 | for(int32_t i=0;i<=N2+N;++i){ |
alexpirciu | 1:ceee5a608e7c | 103 | T sum=static_cast<T>(0); |
alexpirciu | 1:ceee5a608e7c | 104 | for(int32_t j=0;j<=i;++j){ |
alexpirciu | 1:ceee5a608e7c | 105 | sum+=this->getCoefficientValue(j)*b.getCoefficientValue(i-j); |
alexpirciu | 1:ceee5a608e7c | 106 | } |
alexpirciu | 1:ceee5a608e7c | 107 | result.setCoefficientValue(i,sum); |
alexpirciu | 1:ceee5a608e7c | 108 | } |
alexpirciu | 1:ceee5a608e7c | 109 | |
alexpirciu | 1:ceee5a608e7c | 110 | return result; |
alexpirciu | 1:ceee5a608e7c | 111 | } |
alexpirciu | 1:ceee5a608e7c | 112 | |
alexpirciu | 1:ceee5a608e7c | 113 | template<class T,int32_t N> |
alexpirciu | 1:ceee5a608e7c | 114 | /** |
alexpirciu | 1:ceee5a608e7c | 115 | * @brief Calculate the polynom value |
alexpirciu | 1:ceee5a608e7c | 116 | * |
alexpirciu | 1:ceee5a608e7c | 117 | * @param input_value The given value |
alexpirciu | 1:ceee5a608e7c | 118 | * @return The result value of the polynom. |
alexpirciu | 1:ceee5a608e7c | 119 | */ |
alexpirciu | 1:ceee5a608e7c | 120 | T PolynomialFunction<T,N>::calculateValue(T input_value){ |
alexpirciu | 1:ceee5a608e7c | 121 | T output_value=static_cast<T>(0); |
alexpirciu | 1:ceee5a608e7c | 122 | for(int32_t i=0;i<=N;++i){ |
alexpirciu | 1:ceee5a608e7c | 123 | output_value+=this->coefficients[i]*static_cast<T>(pow(input_value,i)); |
alexpirciu | 1:ceee5a608e7c | 124 | } |
alexpirciu | 1:ceee5a608e7c | 125 | // std::cout<<"OOO"<<output_value<<std::endl; |
alexpirciu | 1:ceee5a608e7c | 126 | return output_value; |
alexpirciu | 1:ceee5a608e7c | 127 | } |
alexpirciu | 1:ceee5a608e7c | 128 | |
alexpirciu | 1:ceee5a608e7c | 129 | template<class T, int32_t N> |
alexpirciu | 1:ceee5a608e7c | 130 | /** |
alexpirciu | 1:ceee5a608e7c | 131 | * @brief It calcutes the first derivate of the polinom and return it by creating a new polynomial function object. |
alexpirciu | 1:ceee5a608e7c | 132 | * |
alexpirciu | 1:ceee5a608e7c | 133 | * @return The result polynom. |
alexpirciu | 1:ceee5a608e7c | 134 | */ |
alexpirciu | 1:ceee5a608e7c | 135 | math::PolynomialFunction<T,N-1> PolynomialFunction<T,N>::derivateFO(){ |
alexpirciu | 1:ceee5a608e7c | 136 | math::PolynomialFunction<T,N-1> derivate; |
alexpirciu | 1:ceee5a608e7c | 137 | for(int32_t i=0;i<N;++i){ |
alexpirciu | 1:ceee5a608e7c | 138 | T coeff=static_cast<T>(i+1); |
alexpirciu | 1:ceee5a608e7c | 139 | derivate.setCoefficientValue(i,coeff*this->getCoefficientValue(i+1)); |
alexpirciu | 1:ceee5a608e7c | 140 | } |
alexpirciu | 1:ceee5a608e7c | 141 | return derivate; |
alexpirciu | 1:ceee5a608e7c | 142 | }; |
alexpirciu | 1:ceee5a608e7c | 143 | |
alexpirciu | 1:ceee5a608e7c | 144 | }; |