Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Projected Separation and 3D Distance Problem (Code Included)

  1. Jan 6, 2013 #1
    Hi all, I've written code that takes J2000 equatorial coordinates for 2 objects and calculates (1) the projected separation of between object 1 and object 2 at the distance of object 1, and the Euclidean (3D) distance between objects 1 and 2. The projected separations should be <= the Euclidean distance, but most of the time they aren't. I've checked both formulae several times and am left scratching my head. As a last ditch effort, perhaps someone here can spot the error. Projected separations are calculated via the Haversine formula. See the C/C++ functions below, where I've included the struct:

    Code (Text):

    typedef struct _galaxy{
        char Name[12];
        double RA, DE;
        double D;
    } galaxy;

    double separation (galaxy gal1, galaxy gal2)
    {
      // convert from eq coords to Cartesian
      double x1 = gal1.D * cos(gal1.DE * DEG_TO_RAD) * cos(gal1.RA * DEG_TO_RAD);
      double x2 = gal2.D * cos(gal2.DE * DEG_TO_RAD) * cos(gal2.RA * DEG_TO_RAD);
      double y1 = gal1.D * cos(gal1.DE * DEG_TO_RAD) * sin(gal1.RA * DEG_TO_RAD);
      double y2 = gal2.D * cos(gal2.DE * DEG_TO_RAD) * sin(gal2.RA * DEG_TO_RAD);
      double z1 = gal1.D * sin(gal1.DE * DEG_TO_RAD);
      double z2 = gal2.D * sin(gal2.DE * DEG_TO_RAD);
      // compute 3d separation
      double out = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1) );
      return out;
    }

    double proj_separation(galaxy gal1, galaxy gal2)
    {
      double dDE = ( gal1.DE - gal2.DE ) * DEG_TO_RAD;
      double dRA = ( gal1.RA - gal2.RA ) * DEG_TO_RAD;
      // calculate projected separation of galaxy 2 at the distance of galaxy 1 (Haversine)
      double out = gal1.D * ( 2.0 * asin(
                                    sqrt( ( sin( dDE/2.0 ) * sin( dDE/2.0 ) )
                                        + ( cos( gal1.DE * DEG_TO_RAD )
                                           * cos( gal2.DE * DEG_TO_RAD )
                                           * sin( dRA / 2.0 )
                                           * sin( dRA / 2.0 )
                            ) ) ) ) ;
      return out;
    }
     
  2. jcsd
  3. Jan 7, 2013 #2

    mfb

    User Avatar
    2016 Award

    Staff: Mentor

    Why?
    Consider two galaxies at the same distance D to us, but separated by 90° (as seen by us).
    Their Euclidian distance is ##D\sqrt{2}##, but if you project this distance on a great circle, you get ##D\frac{\pi}{2} > D\sqrt{2}##.
    The 90° are arbitrary, the inequality holds for any angle.
     
  4. Jan 7, 2013 #3
    Because a projected separation is calculated assuming the distances to each are the same. Any difference between the distances two is going to give a true separation that is greater than the projected one.

    Yes, I think the difference here is that, by projected separation, I intend to mean projected distance between the two. I'm not sure that projecting on to a great circle is a valid thing to do. So, maybe I shouldn't be using the Haversine function...
     
  5. Jan 7, 2013 #4

    mfb

    User Avatar
    2016 Award

    Staff: Mentor

    As shown, you compare two different distance measurements, even if the distances to us are the same.

    At least not if you want to compare it to the Euclidian distance.

    You can calculate the Euclidian distance if you project the galaxy further away to the distance of the other galaxy. In that case, you should get a value which does not exceed the true separation.
     
  6. Jan 7, 2013 #5
    Right, this discussion has been helpful. I guess my initial assertion was incorrect and I can continue on but I'm still feeling a bit uneasy about it.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Projected Separation and 3D Distance Problem (Code Included)
Loading...