aboutsummaryrefslogtreecommitdiff
path: root/noao/twodspec/apextract/apnearest.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/twodspec/apextract/apnearest.x')
-rw-r--r--noao/twodspec/apextract/apnearest.x75
1 files changed, 75 insertions, 0 deletions
diff --git a/noao/twodspec/apextract/apnearest.x b/noao/twodspec/apextract/apnearest.x
new file mode 100644
index 00000000..f3e027c5
--- /dev/null
+++ b/noao/twodspec/apextract/apnearest.x
@@ -0,0 +1,75 @@
+include <mach.h>
+include "apertures.h"
+
+# AP_NEAREST -- Find the index of the aperture nearest cursor position x.
+
+define DELTA 0.01 # Tolerance for equidistant apertures
+
+procedure ap_nearest (index, line, aps, naps, x)
+
+int index # Index of aperture nearest x
+int line # Dispersion line
+pointer aps[ARB] # Aperture pointers
+int naps # Number of apertures
+real x # Point nearest aperture
+
+int i, j, apaxis
+char ch
+real d, delta
+pointer ap
+
+int fscan(), nscan()
+real ap_cveval()
+
+begin
+ if (naps == 0)
+ return
+
+ index = 0
+ delta = MAX_REAL
+
+ for (i = 1; i <= naps; i = i + 1) {
+ ap = aps[i]
+ apaxis = AP_AXIS(ap)
+ d = abs (AP_CEN(ap, apaxis)+ap_cveval(AP_CV(ap),real(line))-x)
+ if (d < delta - DELTA) {
+ j = 1
+ index = i
+ delta = d
+ } else if (d < delta + DELTA)
+ j = j + 1
+ }
+
+ # If there is more than one aperture equally near ask the user.
+ if (j > 1) {
+ call printf ("Apertures")
+ for (i = 1; i <= naps; i = i + 1) {
+ ap = aps[i]
+ apaxis = AP_AXIS(ap)
+ d = abs (AP_CEN(ap, apaxis)+ap_cveval(AP_CV(ap),real(line))-x)
+ if (d < delta + DELTA) {
+ call printf (" %d")
+ call pargi (AP_ID (ap))
+ }
+ }
+ call printf (" are equally near the cursor.\n")
+10 call printf ("Choose an aperture (%d): ")
+ call pargi (AP_ID (aps[index]))
+ call flush (STDOUT)
+ if (fscan (STDIN) != EOF) {
+ call scanc (ch)
+ if (ch == '\n')
+ return
+
+ call reset_scan()
+ call gargi (j)
+ if (nscan() == 0)
+ goto 10
+ for (i=1; (i<=naps)&&(AP_ID(aps[i])!=j); i=i+1)
+ ;
+ if (i > naps)
+ goto 10
+ index = i
+ }
+ }
+end