Index: trunk/Ohana/src/libdvo/src/coordops.c
===================================================================
--- trunk/Ohana/src/libdvo/src/coordops.c	(revision 12751)
+++ trunk/Ohana/src/libdvo/src/coordops.c	(revision 12752)
@@ -200,16 +200,16 @@
     sphi = cdel*salp;                   /* = cos(theta)*sin(phi) */
     cphi = cdel*sdp*calp - sdel*cdp;    /* = cos(theta)*cos(phi) */
-    if (stht < 0) return (FALSE);
 
     switch (proj) {
       case PROJ_TAN:
       case PROJ_DIS:
-	*L =  DEG_RAD * sphi / stht;
-	*M = -DEG_RAD * cphi / stht;
-	return (TRUE);
+	Rc = hypot(sphi, cphi);
+	*L = (stht == 0) ? 180.0 * sphi / Rc :  +DEG_RAD * sphi / stht;
+	*M = (stht == 0) ? 180.0 * cphi / Rc :  -DEG_RAD * cphi / stht;
+	return (stht > 0);
       case PROJ_SIN:
-	*L =  DEG_RAD * sphi;
+	*L = +DEG_RAD * sphi;
 	*M = -DEG_RAD * cphi;
-	return (TRUE);
+	return (stht > 0);
       case PROJ_ZEA:
       case PROJ_ZPL:
@@ -217,5 +217,5 @@
 	*L =  Rc * sphi;
 	*M = -Rc * cphi;
-	return (TRUE);
+	return (stht > 0);
       default:
 	return (FALSE);
@@ -320,7 +320,11 @@
 
   status = RD_to_LM (&L, &M, ra, dec, coords);
-  if (!status) return FALSE;
-
-  status = LM_to_XY (x, y, L, M, coords);
+
+  if (finite(L) && finite(M)) {
+      LM_to_XY (x, y, L, M, coords);
+  } else {
+      *x = L;
+      *y = M;
+  }
   return (status);
 }
