| 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 | } | 
|---|