| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | void slaPxy ( int np, double xye[][2], double xym[][2],
|
|---|
| 4 | double coeffs[6], double xyp[][2],
|
|---|
| 5 | double *xrms, double *yrms, double *rrms )
|
|---|
| 6 | /*
|
|---|
| 7 | ** - - - - - - -
|
|---|
| 8 | ** s l a P x y
|
|---|
| 9 | ** - - - - - - -
|
|---|
| 10 | **
|
|---|
| 11 | ** Given arrays of "expected" and "measured" [x,y] coordinates, and a
|
|---|
| 12 | ** linear model relating them (as produced by slaFitxy), compute
|
|---|
| 13 | ** the array of "predicted" coordinates and the rms residuals.
|
|---|
| 14 | **
|
|---|
| 15 | ** Given:
|
|---|
| 16 | ** np int number of samples
|
|---|
| 17 | ** xye double[np] expected [x,y] for each sample
|
|---|
| 18 | ** xym double[np] measured [x,y] for each sample
|
|---|
| 19 | ** coeffs double[6] coefficients of model (see below)
|
|---|
| 20 | **
|
|---|
| 21 | ** Returned:
|
|---|
| 22 | ** xyp double[np] predicted [x,y] for each sample
|
|---|
| 23 | ** *xrms double RMS in x
|
|---|
| 24 | ** *yrms double RMS in y
|
|---|
| 25 | ** *rrms double total RMS (vector sum of xrms and yrms)
|
|---|
| 26 | **
|
|---|
| 27 | ** The model is supplied in the array coeffs. Naming the
|
|---|
| 28 | ** elements of coeff as follows:
|
|---|
| 29 | **
|
|---|
| 30 | ** coeffs[0] = a
|
|---|
| 31 | ** coeffs[1] = b
|
|---|
| 32 | ** coeffs[2] = c
|
|---|
| 33 | ** coeffs[3] = d
|
|---|
| 34 | ** coeffs[4] = e
|
|---|
| 35 | ** coeffs[5] = f
|
|---|
| 36 | **
|
|---|
| 37 | ** The model is applied thus:
|
|---|
| 38 | **
|
|---|
| 39 | ** xp = a + b*xm + c*ym
|
|---|
| 40 | ** yp = d + e*xm + f*ym
|
|---|
| 41 | **
|
|---|
| 42 | ** The residuals are (xp-xe) and (yp-ye).
|
|---|
| 43 | **
|
|---|
| 44 | ** If np is less than or equal to zero, no coordinates are
|
|---|
| 45 | ** transformed, and the rms residuals are all zero.
|
|---|
| 46 | **
|
|---|
| 47 | ** See also slaFitxy, slaInvf, slaXy2xy, slaDcmpf
|
|---|
| 48 | **
|
|---|
| 49 | ** Called: slaXy2xy
|
|---|
| 50 | **
|
|---|
| 51 | ** Last revision: 31 October 1993
|
|---|
| 52 | **
|
|---|
| 53 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 54 | */
|
|---|
| 55 | {
|
|---|
| 56 | int i;
|
|---|
| 57 | double sdx2, sdy2, xp, yp, dx, dy, dx2, dy2, p;
|
|---|
| 58 |
|
|---|
| 59 | /* Initialize summations */
|
|---|
| 60 | sdx2 = 0.0;
|
|---|
| 61 | sdy2 = 0.0;
|
|---|
| 62 |
|
|---|
| 63 | /* Loop by sample */
|
|---|
| 64 | for ( i = 0; i < np; i++ ) {
|
|---|
| 65 |
|
|---|
| 66 | /* Transform "measured" [x,y] to "predicted" [x,y] */
|
|---|
| 67 | slaXy2xy ( xym[i][0], xym[i][1], coeffs, &xp, &yp );
|
|---|
| 68 | xyp[i][0] = xp;
|
|---|
| 69 | xyp[i][1] = yp;
|
|---|
| 70 |
|
|---|
| 71 | /* Compute residuals in x and y, and update summations */
|
|---|
| 72 | dx = xye[i][0] - xp;
|
|---|
| 73 | dy = xye[i][1] - yp;
|
|---|
| 74 | dx2 = dx * dx;
|
|---|
| 75 | dy2 = dy * dy;
|
|---|
| 76 | sdx2 = sdx2 + dx2;
|
|---|
| 77 | sdy2 = sdy2 + dy2;
|
|---|
| 78 |
|
|---|
| 79 | /* Next sample */
|
|---|
| 80 | }
|
|---|
| 81 |
|
|---|
| 82 | /* Compute RMS values */
|
|---|
| 83 | p = (double) gmax ( 1.0, np );
|
|---|
| 84 | *xrms = sqrt ( sdx2 / p );
|
|---|
| 85 | *yrms = sqrt ( sdy2 / p );
|
|---|
| 86 | *rrms = sqrt ( *xrms * *xrms + *yrms * *yrms );
|
|---|
| 87 | }
|
|---|