BSplinebasis
Loading...
Searching...
No Matches
misc.h
1/*
2 * ########################################################################
3 * The contents of this file is free and unencumbered software released into the
4 * public domain. For more information, please refer to <http://unlicense.org/>
5 * ########################################################################
6 */
7
8#ifndef BSPLINE_MISC_H
9#define BSPLINE_MISC_H
10
11#include <array>
12
13#ifndef BSPLINE_DOXYGEN_IGNORE
18namespace bspline::internal {
19
28template <typename T, size_t size>
29std::array<T, size> make_array(T val) {
30 std::array<T, size> ret;
31 ret.fill(val);
32 return ret;
33}
34
46template <typename T, size_t sizea, size_t sizeb>
47std::array<T, std::max(sizea, sizeb)> add(const std::array<T, sizea> &a,
48 const std::array<T, sizeb> &b) {
49 if constexpr (sizeb > sizea) {
50 return add(b, a);
51 } else {
52 std::array<T, sizea> ret = a;
53 for (size_t i = 0; i < sizeb; i++) {
54 ret[i] += b[i];
55 }
56 return ret;
57 }
58}
59
70template <typename T, size_t sizein, size_t sizeout>
71std::array<T, sizeout> changearraysize(const std::array<T, sizein> &in) {
72 static_assert(sizeout >= sizein,
73 "sizeout must be bigger or equal to sizein.");
74 if constexpr (sizeout == sizein)
75 return in;
76 else {
77 std::array<T, sizeout> ret;
78 for (size_t i = 0; i < sizein; i++) ret[i] = in[i];
79 for (size_t i = sizein; i < sizeout; i++) ret[i] = static_cast<T>(0);
80 return ret;
81 }
82}
83
98template <typename T, size_t size>
99T evaluateInterval(const T &x, const std::array<T, size> &coeffs, const T &xm) {
100 // Use Horner's scheme to evaluate.
101 const T dx = x - xm;
102 T result = coeffs.back();
103 for (auto it = coeffs.rbegin() + 1; it != coeffs.rend(); it++) {
104 result = dx * result + (*it);
105 }
106 return result;
107}
108
116template <typename T>
117T faculty(size_t n) {
118 T retVal = static_cast<T>(1);
119 for (size_t i = 2; i <= n; i++) {
120 retVal *= static_cast<T>(i);
121 }
122 return retVal;
123}
124
133template <typename T>
134T facultyRatio(size_t counter, size_t denominator) {
135 if (denominator > counter) {
136 return static_cast<T>(1) / facultyRatio<T>(denominator, counter);
137 } else {
138 T retVal = static_cast<T>(1);
139 for (size_t i = denominator + 1; i <= counter; i++) {
140 retVal *= static_cast<T>(i);
141 }
142 return retVal;
143 }
144}
145
155template <typename T>
156T binomialCoefficient(size_t n, size_t k) {
157 if (k > n) {
158 return static_cast<T>(0);
159 }
160
161 const size_t smaller = std::min(k, n - k);
162 const size_t larger = std::max(k, n - k);
163
164 return facultyRatio<T>(n, larger) / faculty<T>(smaller);
165}
166
167} // end namespace bspline::internal
168
169#endif // BSPLINE_DOXYGEN_IGNORE
170#endif // BSPLINE_MISC_H
Represents a global Grid.
Definition Grid.h:27