ISCE_INSAR/components/isceobj/Util/Library/poly2d/src/poly2d.c

221 lines
5.6 KiB
C
Raw Normal View History

2019-01-16 19:40:08 +00:00
/*#!/usr/bin/env python*/
/*#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*# Author: Piyush Agram*/
/*# Copyright 2014, by the California Institute of Technology. ALL RIGHTS RESERVED.*/
/*# United States Government Sponsorship acknowledged.*/
/*# Any commercial use must be negotiated with the Office of Technology Transfer at*/
/*# the California Institute of Technology.*/
/*# This software may be subject to U.S. export control laws.*/
/*# By accepting this software, the user agrees to comply with all applicable U.S.*/
/*# export laws and regulations. User has the responsibility to obtain export licenses,*/
/*# or other export authority as may be required before exporting such information to*/
/*# foreign countries or providing access to foreign persons.*/
/*#*/
/*#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "poly2d.h"
//Create a polynomial object
cPoly2d* createPoly2d(int azOrder, int rgOrder)
{
cPoly2d* newObj = (cPoly2d*) malloc(sizeof(cPoly2d));
if(newObj == NULL)
{
printf("Not enough memory for polynomial object");
}
initPoly2d(newObj, azOrder, rgOrder);
return newObj;
}
//Initialize polynomial
void initPoly2d(cPoly2d* poly, int azOrder, int rgOrder)
{
poly->coeffs = (double*) malloc(sizeof(double)*(azOrder+1)*(rgOrder+1));
if (poly->coeffs == NULL)
{
printf( "Not enough memory for polynomial object of order %d -by- %d \n", azOrder, rgOrder);
}
poly->azimuthOrder = azOrder;
poly->rangeOrder = rgOrder;
//Currently only these.
poly->meanRange = 0.0;
poly->meanAzimuth = 0.0;
poly->normRange = 1.0;
poly->normAzimuth = 1.0;
}
//Delete polynomial object
void deletePoly2d(cPoly2d* obj)
{
cleanPoly2d(obj);
free((char*) obj);
}
//Clean up polynomial memory
void cleanPoly2d(cPoly2d* obj)
{
free((char*) obj->coeffs);
}
//Set polynomial coefficient
void setCoeff2d(cPoly2d *src, int i, int j, double value)
{
int index = i*(src->rangeOrder+1) + j;
/* if (i >= src->azimuthOrder)
{
cout << "Index exceeds azimuth order bounds \n";
exit(1);
}
if (j >= src->rangeOrder)
{
cout << "Index exceeds range order bounds \n";
exit(1);
} */
src->coeffs[index] = value;
}
//To get the coefficient
double getCoeff2d(cPoly2d *src, int i, int j)
{
double value;
int index = i*(src->rangeOrder+1) + j;
value = src->coeffs[index];
return value;
}
//Evaluate the polynomial
double evalPoly2d(cPoly2d* poly, double azi, double rng)
{
int i,j;
double value = 0.0;
double scalex,scaley;
double xval, yval;
xval = (rng - poly->meanRange)/(poly->normRange);
yval = (azi - poly->meanAzimuth)/(poly->normAzimuth);
scaley = 1.0;
for(i = 0; i <= poly->azimuthOrder; i++,scaley*=yval)
{
scalex = 1.0;
for(j = 0; j <= poly->rangeOrder; j++,scalex*=xval)
{
value += scalex*scaley*getCoeff2d(poly,i,j);
// printf("evalPoly2d %f %d %d %f %f\n",getCoeff2d(poly,i,j),i,j,azi,rng);
}
}
return value;
}
//Setup Basis
void getBasis2d(cPoly2d* src, double azi, double rng, int* indices, double* values, int len)
{
int i,j,k,ind, ind1;
double xval, yval;
double scalex,scaley;
xval = (rng - src->meanRange)/(src->normRange);
yval = (azi - src->meanAzimuth)/(src->normAzimuth);
k = 0;
ind = indices[0];
scaley = 1.0;
for(i=0; i<= src->azimuthOrder; i++, scaley*=yval)
{
scalex = scaley;
for(j=0; j<= src->rangeOrder; j++, scalex *= xval)
{
ind1 = i*(src->rangeOrder+1)+j;
if(ind1 == ind)
{
values[k] = scalex;
ind = indices[++k];
}
}
}
}
//Print polynomial for debugging
void printPoly2d(cPoly2d* poly)
{
int i,j;
printf("Polynomial Order: %d - by - %d \n", poly->azimuthOrder, poly->rangeOrder);
for(i=0; i<= (poly->azimuthOrder); i++)
{
for(j=0; j<= (poly->rangeOrder); j++)
{
printf("%g\t", getCoeff2d(poly, i, j));
}
printf("\n");
}
}
//Modify the reference for the polynomial
//To be added
void modifyMean(cPoly2d* src, cPoly2d *targ, double azioff, double rngoff)
{
0;
}
//Modify the scaling factors for the polynomial
//To be added
void modifyNorm(cPoly2d* src, cPoly2d *targ, double azinorm, double rngnorm)
{
double azfact, rgfact, val;
double azratio, rgratio;
int i,j;
if(src->azimuthOrder > targ->azimuthOrder)
{
printf("Azimuth orders of source and target are not compatible.");
}
if(src->rangeOrder > src->azimuthOrder)
{
printf("Range orders of source and target are not compatible.");
}
azratio = src->normAzimuth / azinorm;
rgratio = src->normRange / rngnorm;
azfact = 1.0/azratio;
for(i=0; i<src->azimuthOrder; i++)
{
azfact *= azratio;
rgfact = 1.0/rgratio;
for(j=0; j<src->rangeOrder; j++)
{
rgfact *= rgratio;
val = getCoeff2d(src, i, j);
setCoeff2d(targ, i, j, val*rgfact*azfact);
}
}
targ->normAzimuth = azinorm;
targ->normRange = rngnorm;
for(i=src->azimuthOrder+1; i<=targ->azimuthOrder; i++)
{
for(j=src->rangeOrder+1; j<=targ->rangeOrder; j++)
{
setCoeff2d(targ, i, j, 0.0);
}
}
}
//Scale polynomial from one order to another with support
//To be added
void scalePoly2d(cPoly2d *src, cPoly2d* targ, double minaz, double maxaz, double minrg, double maxrg)
{
0;
}