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].