Map Your Apps: Listing 2.

Drawing an arc using a Bezier curve.

private void DrawCurve(Location start, Location finish)
{
  MapPolyline curve = new MapPolyline();
  curve.Stroke = new SolidColorBrush(Colors.Magenta);
  curve.StrokeThickness = 3.0;
  curve.StrokeDashArray = new DoubleCollection(new double[] { 5, 2 });
  curve.Opacity = 1.0;

  LocationCollection coll = new LocationCollection();

  // Compute control point
  Point p1 = myMap.LocationToViewportPoint(start);
  Point p2 = myMap.LocationToViewportPoint(finish);

  double boundingBoxHalfWidth = (p2.X - p1.X) / 2.0;
  double boundingBoxHalfHeight = (p1.Y - p2.Y) / 2.0;

  double centerX = (p1.X + p2.X) / 2.0;
  double centerY = (p1.Y + p2.Y) / 2.0;

  double xScale = 1.0;
  double yScale = 1.0;

  double controlX = centerX - (xScale * boundingBoxHalfWidth);
  double controlY = centerY - (yScale * boundingBoxHalfHeight);

  Point controlPt = new Point(controlX, controlY);
  Location controlLoc = myMap.ViewportPointToLocation(controlPt);

  // Compute intermediate Locations using the control point
  int numSegments = 31;
  doublet Delta = 1.0 / numSegments;
  for (double t = 0.0; t <= 1.0; t += tDelta) // Danger!
  {
    // x coordinate (longitudes)
    double a = (1.0 - t) * (1.0 - t) * start.Longitude;
    double b = 2.0 * (1.0 - t) * t * controlLoc.Longitude;
    double c = t * t * finish.Longitude;
    double Blon = a + b + c;

    // y coordinate (latitudes)
    a = (1.0 - t) * (1.0 - t) * start.Latitude;
    b = 2.0 * (1.0 - t) * t * controlLoc.Latitude;
    c = t * t * finish.Latitude;
    double Blat = a + b + c;

    coll.Add(new Location(Blat, Blon));
  }

  curve.Locations = coll;
  myMap.Children.Add(curve);
}

About the Author

Dr. James McCaffrey works for Microsoft Research in Redmond, Wash. He has worked on several Microsoft products including Azure and Bing. James can be reached at [email protected].

comments powered by Disqus

Featured

  • GitHub Previews Agentic AI in VS Code Copilot

    GitHub announced a raft of improvements to its Copilot AI in the Visual Studio Code editor, including a new "agent mode" in preview that lets developers use the AI technology to write code faster and more accurately.

  • Copilot Engineering in the Cloud with Azure and GitHub

    Who better to lead a full-day deep dive into this tech than two experts from GitHub, which introduced the original "AI pair programmer" and spawned the ubiquitous Copilot moniker?

  • Uno Platform Wants Microsoft to Improve .NET WebAssembly in Two Ways

    Uno Platform, a third-party dev tooling specialist that caters to .NET developers, published a report on the state of WebAssembly, addressing some shortcomings in the .NET implementation it would like to see Microsoft address.

  • Random Neighborhoods Regression Using C#

    Dr. James McCaffrey from Microsoft Research presents a complete end-to-end demonstration of the random neighborhoods regression technique, where the goal is to predict a single numeric value. Compared to other ML regression techniques, advantages are that it can handle both large and small datasets, and the results are highly interpretable.

  • As Some Orgs Restrict DeepSeek AI Usage, Microsoft Offers Models and Dev Guidance

    While some organizations are restricting employee usage of the new open source DeepSeek AI from a Chinese company due to data collection concerns, Microsoft has taken a different approach.

Subscribe on YouTube

Upcoming Training Events