111 lines
3.0 KiB
C++
111 lines
3.0 KiB
C++
//
|
|
// Author: Joshua Cohen
|
|
// Copyright 2017
|
|
//
|
|
|
|
#include <stdio.h>
|
|
#include "Poly2d.h"
|
|
using isceLib::Poly2d;
|
|
|
|
Poly2d::Poly2d() {
|
|
// Empty constructor
|
|
|
|
azimuthOrder = -1;
|
|
rangeOrder = -1;
|
|
azimuthMean = 0.;
|
|
rangeMean = 0.;
|
|
azimuthNorm = 1.;
|
|
rangeNorm = 1.;
|
|
coeffs = NULL;
|
|
}
|
|
|
|
Poly2d::Poly2d(int aord, int rord, double amn, double rmn, double anrm, double rnrm) {
|
|
// Non-empty constructor
|
|
|
|
azimuthOrder = aord;
|
|
rangeOrder = rord;
|
|
azimuthMean = amn;
|
|
rangeMean = rmn;
|
|
azimuthNorm = anrm;
|
|
rangeNorm = rnrm;
|
|
coeffs = new double[(aord+1)*(rord+1)];
|
|
}
|
|
|
|
Poly2d::Poly2d(int aord, int rord, double amn, double rmn, double anrm, double rnrm, double *cfs) {
|
|
// Non-empty constructor (with coefficients)
|
|
|
|
azimuthOrder = aord;
|
|
rangeOrder = rord;
|
|
azimuthMean = amn;
|
|
rangeMean = rmn;
|
|
azimuthNorm = anrm;
|
|
rangeNorm = rnrm;
|
|
coeffs = new double[(aord+1)*(rord+1)];
|
|
for (int i=0; i<((aord+1)*(rord+1)); i++) coeffs[i] = cfs[i];
|
|
}
|
|
|
|
Poly2d::Poly2d(const Poly2d &poly) {
|
|
// Copy constructor
|
|
|
|
azimuthOrder = poly.azimuthOrder;
|
|
rangeOrder = poly.rangeOrder;
|
|
azimuthMean = poly.azimuthMean;
|
|
rangeMean = poly.rangeMean;
|
|
azimuthNorm = poly.azimuthNorm;
|
|
rangeNorm = poly.rangeNorm;
|
|
coeffs = new double[(azimuthOrder+1)*(rangeOrder+1)];
|
|
for (int i=0; i<((azimuthOrder+1)*(rangeOrder+1)); i++) coeffs[i] = poly.coeffs[i];
|
|
}
|
|
|
|
Poly2d::~Poly2d() {
|
|
// Destructor
|
|
|
|
if (coeffs) delete[] coeffs;
|
|
}
|
|
|
|
int Poly2d::isNull() {
|
|
// Safe check method for Python to determine if coeff memory has been malloc'd
|
|
|
|
if (coeffs) return 0;
|
|
return 1;
|
|
}
|
|
|
|
void Poly2d::resetCoeffs() {
|
|
// Scrub the coefficients and reset the memory based on the stored order
|
|
|
|
if (coeffs) delete[] coeffs;
|
|
coeffs = new double[(azimuthOrder+1)*(rangeOrder+1)];
|
|
for (int i=0; i<((azimuthOrder+1)*(rangeOrder+1)); i++) coeffs[i] = 0.;
|
|
}
|
|
|
|
void Poly2d::setCoeff(int row, int col, double val) {
|
|
// Set a given coefficient in the polynomial (0-indexed, 2D->1D indexing)
|
|
|
|
if ((row > azimuthOrder) || (col > rangeOrder)) printf("Error: Trying to set coefficient (%d,%d) out of [%d,%d] in Poly1d.\n", row, col, azimuthOrder, rangeOrder);
|
|
else coeffs[(row*(rangeOrder+1))+col] = val;
|
|
}
|
|
|
|
|
|
double Poly2d::getCoeff(int row, int col) {
|
|
// Get a given coefficient in the polynomial (0-indexed, 2D->1D indexing)
|
|
|
|
if ((row > azimuthOrder) || (col > rangeOrder)) printf("Error: Trying to get coefficient (%d,%d) out of [%d,%d] in Poly1d.\n", row, col, azimuthOrder, rangeOrder);
|
|
else return coeffs[(row*(rangeOrder+1))+col];
|
|
}
|
|
|
|
double Poly2d::eval(double azi, double rng) {
|
|
double val, scalex, scaley, xval, yval;
|
|
val = 0.;
|
|
scaley = 1.;
|
|
xval = (rng - rangeMean) / rangeNorm;
|
|
yval = (azi - azimuthMean) / azimuthNorm;
|
|
for (int i=0; i<=azimuthOrder; i++,scaley*=yval) {
|
|
scalex = 1.;
|
|
for (int j=0; j<=rangeOrder; j++,scalex*=xval) {
|
|
val += scalex * scaley * coeffs[(i*(rangeOrder+1))+j];
|
|
}
|
|
}
|
|
return val;
|
|
}
|
|
|