This discussion is archived
0 Replies Latest reply: Aug 6, 2009 6:48 AM by 800343 RSS

Calculating geodetic ellipse

800343 Newbie
Currently Being Moderated
Hi

In a geographic program I have the following problem:
I have an ellipse given as ellipse(longitude,latitude,semiMajor,semiMinor,angle)
The semiMajor/Minor are in meters.
Now I need to plot this shape acurately onto a map .In order to do this I need to create a whole lot of points on the perimeter of this ellipse and plot each one.
I have a function (see below) which does this .
The problem is that this function does not take into acount the curvature of the earth.
I have another funtion (opensource from http://www.gavaghan.org/blog/free-source-code/geodesy-library-vincentys-formula/)
which takes a starting point ,bearing and distance in meters and evaluates the destination coordinates reached on the earth.
I have tried in the code below to use these two functions together in order to produce an ellipse correct for the earths curvature however for some reason I get a peanut shape instead of an ellipse!
Could someone maybe see where I've gone wrong?

Thanks!
protected void buildEllipse(double centerX,double centerY,
               double semiMajor,double semiMinor,double angleOfEllipse) 
     {
          //the amount of points on the perimeter to calculate
          double angleStepSize = 0.5;
          
          //the array of normal points (using classes from the JTS library)
          Coordinate[] coords1 = new Coordinate[(int)(360/angleStepSize)];
          
          //the array of geodetically corrected points 
          Coordinate[] coords2 = new Coordinate[(int)(360/angleStepSize)];
          
          double beta = -angleOfEllipse * (Math.PI / 180); 
          double sinbeta = Math.sin(beta);
          double cosbeta = Math.cos(beta);

          int i = 0;
          for (double angleOffset = 0; angleOffset < 360; angleOffset += angleStepSize) 
          {
               double alpha = angleOffset * (Math.PI / 180) ;
               double sinalpha = Math.sin(alpha);
               double cosalpha = Math.cos(alpha);

               double xDiff =  
                    (semiMajor * cosalpha * cosbeta - semiMinor * sinalpha * sinbeta);
               double x = centerX + xDiff;
               double yDiff =
                    (semiMajor * cosalpha * sinbeta + semiMinor * sinalpha * cosbeta);
               double y = centerY + yDiff;
               
               coords1[i] = new Coordinate(x,y);

               //here I find the distance in meters from the center of the ellipse
               //to the new x y point found (I hope?)
               double hyp = Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
               double bearing = angleOfEllipse + angleOffset;
               
               //This function finds the destination coordinates on the surface
               //of the earth (I'm sure it works, used it elswhere)
               GlobalCoordinates dest = calculateEndingCoords(centerX,centerY,hyp,bearing);
               coords2[i++] = new Coordinate(dest.getLongitude(),dest.getLatitude());
          }
          //At this stage coords1 draws an ellipse,
          //coords2 draws a peanut!
     }