1

Im using Microsoft visual studio 2010, with the refernce dynamic data display. I would like to draw a circle on a map, i have 2 points, one of them is the center of the circle and the other is the point on the circle, the distance between them is the radius of the circle. the result should look like this :

http://sizmedia.com/my.php?i=mjmynzim2nhy.png

my result when I draw a circle with one point and const distance is like this (distance = radius = 15):

http://sizmedia.com/my.php?i=hm2zuv5yyenj.png

***** I don't care if the circle will look like my result(the ellipse) 
    because as I understood the earth is circle and its type of reasonable. ****

but when I draw circle with distance between 2 point (distance = 3400 +) I can't see the circle that I draw. I would love to get some help, there is my code to find distance between 2 points.

 // Calculating the distance between the two points 
double dLat = (ps.X - centerPoint.X) / 180 * Math.PI;
double dLong = (
       double.Parse(this.plotter.Viewport.Transform.DataTransform.ViewportToData(ps).Y.ToString()) -
       double.Parse(this.plotter.Viewport.Transform.DataTransform.ViewportToData(centerPoint).Y.ToString())) / 180 * Math.PI;

double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2)
            + Math.Cos(ps.X / 180 * Math.PI) * Math.Cos(pointLine1.X / 180 * Math.PI)
            * Math.Sin(dLong / 2) * Math.Sin(dLong / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));

//Calculate radius of earth
double radiusE = 6378135; // Equatorial radius, in metres
double radiusP = 6356750; // Polar Radius

//Numerator part of function
double nr = Math.Pow(radiusE * radiusP * Math.Cos(ps.X / 180 * Math.PI), 2);
//Denominator part of the function
double dr = Math.Pow(radiusE * Math.Cos(ps.X / 180 * Math.PI), 2)
                + Math.Pow(radiusP * Math.Sin(ps.X / 180 * Math.PI), 2);
double radius = Math.Sqrt(nr / dr);

//Calculate distance in meters.
distance = (radius * c); // resualt in meters
distance /= 1000; // resualt in KM

And there is my code to add the circle :

while (a < 360) // Doing one round around the point (The angels)
{
    // Get the X position of the pointClicked
    cx = (double)prePs.X;
    // Get the Y position of the pointClicked
    cy = double.Parse(this.plotter.Viewport.Transform.DataTransform.ViewportToData(prePs).Y.ToString());

    // Get the new X position of the pointClicked by the angel with math calculation
    xEndP = (float)(distance * Math.Cos(a * Math.PI / 180F)) + cx;
    // Get the new Y position of the pointClicked by the angel with math calculation
    yEndP = (float)(distance * Math.Sin(a * Math.PI / 180F)) + cy;

    // Creating the new point 
    globalPoint = new DraggablePoint(new Point(xEndP, yEndP));
    globalPoint.Position = new Point(xEndP, yEndP);
    globalPoint.Visibility = Visibility.Visible;

    // Increas the angel
    a++;
    //Creat new point on the circle with new angel
    xEndPNext = (float)(distance * Math.Cos(a * Math.PI / 180F)) + cx;
    yEndPNext = (float)(distance * Math.Sin(a * Math.PI / 180F)) + cy;

    // Creat line between the two new points that we creat now
    segmentHelper = new Segment(new Point(xEndP, yEndP), new Point(xEndPNext, yEndPNext));

    // Brush between the points by line
    SolidColorBrush mySolidColorBrush = new SolidColorBrush();
    mySolidColorBrush.Color = Color.FromArgb(255, 47, 79, 49);
    segmentHelper.Stroke = mySolidColorBrush;

    // Add the line to the chartplotter
    plotter.Children.Add(segmentHelper);

    // Add the angel
    a++;
}

My algorithm is take one point, and the next point and to draw line between them ( when the points are visiblty false) and then i get a nice circle. Thank you very much :)

Keugyeol
  • 2,355
  • 1
  • 28
  • 36
Ben Tubul
  • 45
  • 1
  • 9
  • 1
    Well, your circles are correct though, It's the map that's distorted ! (However you might still want to draw a perfect circle on the projected map) – nos Sep 24 '14 at 12:18
  • Have a look at http://en.wikipedia.org/wiki/Tissot%27s_indicatrix this shows how different map projections distort a circle on the surface of the earth. They don't always produce circles or ellipses, see for example https://commons.wikimedia.org/wiki/File:Tissot_behrmann.png. I don't recognise the projection you have used where did you get the formula. – Salix alba Sep 24 '14 at 21:38
  • Any way I dont know how to creat a circle by my distance.. because the distance is about thaousends and its too big to see it. how can i do it exactly ? – Ben Tubul Sep 25 '14 at 11:12

0 Answers0