lsst.geom
g19811a7679+d02280c829
Toggle main menu visibility
Loading...
Searching...
No Matches
src
polynomials
PolynomialFunction2d.cc
Go to the documentation of this file.
1
// -*- LSST-C++ -*-
2
/*
3
* Developed for the LSST Data Management System.
4
* This product includes software developed by the LSST Project
5
* (https://www.lsst.org).
6
* See the COPYRIGHT file at the top-level directory of this distribution
7
* for details of code ownership.
8
*
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation, either version 3 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program. If not, see <https://www.gnu.org/licenses/>.
21
*/
22
23
#include <vector>
24
25
#include "
lsst/geom/polynomials/PolynomialFunction2d.h
"
26
#include "
lsst/geom/polynomials/BinomialMatrix.h
"
27
#include "
lsst/geom/polynomials/SafeSum.h
"
28
29
30
namespace
lsst
{
namespace
geom
{
namespace
polynomials
{
31
32
namespace
{
33
34
Eigen::VectorXd computePowers(
double
x,
int
n) {
35
Eigen::VectorXd r(n + 1);
36
r[0] = 1.0;
37
for
(
int
i = 1; i <= n; ++i) {
38
r[i] = r[i - 1]*x;
39
}
40
return
r;
41
}
42
43
}
// anonymous
44
45
46
template
<PackingOrder packing>
47
PolynomialFunction2d<packing>
simplified
(
ScaledPolynomialFunction2d<packing>
const
& f) {
48
auto
const
& basis = f.
getBasis
();
49
std::vector<SafeSum<double>
> sums(basis.size());
50
std::size_t
const
n = basis.getOrder();
51
auto
rPow = computePowers(basis.getScaling().getX().getScale(), n);
52
auto
sPow = computePowers(basis.getScaling().getY().getScale(), n);
53
auto
uPow = computePowers(basis.getScaling().getX().getShift(), n);
54
auto
vPow = computePowers(basis.getScaling().getY().getShift(), n);
55
BinomialMatrix
binomial(basis.getNested().getOrder());
56
for
(
auto
const
& i : basis.getIndices()) {
57
for
(
std::size_t
j = 0; j <= i.nx; ++j) {
58
double
tmp = binomial(i.nx, j)*uPow[j] *
59
f[i.flat]*rPow[i.nx]*sPow[i.ny];
60
for
(
std::size_t
k = 0; k <= i.ny; ++k) {
61
sums[basis.index(i.nx - j, i.ny - k)] +=
62
binomial(i.ny, k)*vPow[k]*tmp;
63
}
64
}
65
}
66
Eigen::VectorXd result = Eigen::VectorXd::Zero(basis.size());
67
for
(
std::size_t
i = 0; i < basis.size(); ++i) {
68
result[i] =
static_cast<
double
>
(sums[i]);
69
}
70
return
makeFunction2d
(basis.getNested(), result);
71
}
72
73
template
PolynomialFunction2d<PackingOrder::XY>
simplified
(
74
ScaledPolynomialFunction2d<PackingOrder::XY>
const
&
75
);
76
template
PolynomialFunction2d<PackingOrder::YX>
simplified
(
77
ScaledPolynomialFunction2d<PackingOrder::YX>
const
&
78
);
79
80
}}}
// namespace lsst::geom::polynomials
BinomialMatrix.h
PolynomialFunction2d.h
SafeSum.h
lsst::geom::polynomials::BinomialMatrix
A class that computes binomial coefficients up to a certain power.
Definition
BinomialMatrix.h:45
lsst::geom::polynomials::Function2d::getBasis
Basis const & getBasis() const
Return the associated Basis2d object.
Definition
Function2d.h:101
lsst::geom::polynomials
Low-level polynomials (including special polynomials) in C++.
lsst::geom::polynomials::makeFunction2d
Function2d< Basis > makeFunction2d(Basis const &basis, Eigen::VectorXd const &coefficients)
Create a Function2d of the appropriate type from a Basis2d and an Eigen object containing coefficient...
Definition
Function2d.h:155
lsst::geom::polynomials::simplified
PolynomialFunction1d simplified(ScaledPolynomialFunction1d const &f)
Calculate the standard polynomial function that is equivalent to a scaled standard polynomial functio...
Definition
PolynomialFunction1d.cc:32
lsst::geom::polynomials::ScaledPolynomialFunction2d
Function2d< ScaledPolynomialBasis2d< packing > > ScaledPolynomialFunction2d
A Function2d for scaled standard polynomials.
Definition
PolynomialFunction2d.h:36
lsst::geom::polynomials::PolynomialFunction2d
Function2d< PolynomialBasis2d< packing > > PolynomialFunction2d
A Function2d for standard polynomials.
Definition
PolynomialFunction2d.h:32
lsst::geom
Definition
AffineTransform.h:36
lsst
std::size_t
std::vector
Generated on
for lsst.geom by
1.17.0