1

Microsoft Visual Studio 2010 を使用しており、参照動的データ表示を使用しています。地図上に円を描きたいのですが、2 つの点があります。そのうちの 1 つは円の中心で、もう 1 つは円上の点です。それらの間の距離は円の半径です。結果は次のようになります。

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

1つの点で円を描いたときの結果とconst distanceは次のようになります(距離=半径= 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. ****

しかし、2点間の距離(距離= 3400 +)で円を描くと、描いた円が見えません。2点間の距離を見つけるコードがあります。

 // 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

そして、円を追加する私のコードがあります:

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++;
}

私のアルゴリズムは、1 つのポイントと次のポイントを取り、それらの間に線を引くことです (ポイントが false の場合)。どうもありがとうございました :)

4

0 に答える 0