Мне нужно нарисовать линии, чтобы продемонстрировать транспортировку товаров на картах бинга. Чтобы уточнить начальную и конечную точку, я нарисую небольшую стрелку на стороне назначения. Проблема в том, что когда я просматриваю глобальную карту, некоторые строки рисуются по кратчайшему пути «по спине». Например, из Нью-Йорка в Токио он будет проходить через Тихий океан. Поскольку стрелка нарисована отдельно, она обращена вспять.Рисование стрелок на картах бинга в Silverlight
>-------
вместо
<-------
Эта проблема становится еще хуже, когда пользователь прокрутки на восток/запад на карте, так что Европа больше не по центру.
Это код, который у меня есть. Проблема в том, что я этого не писал, но все же исправил ошибку, представленную в этом вопросе. Если у вас есть предложения по оптимизации, не стесняйтесь упоминать об этом.
public class MapArrow
{
private readonly MapPolyline line;
private readonly MapLayer arrowLayer;
private readonly Polyline arrowLine;
#region constructor
public MapArrow(Location start, Location end)
: this(start, end, Colors.Red)
{
}
public MapArrow(Location start, Location end)
{
color.A = 200;
Color = Colors.Red;
drawingColor = Colors.Red;
HeadWidth = 8;
HeadHeight = 8;
StrokeThikness = 5;
Start = start;
End = end;
line = new MapPolyline();
arrowLayer = new MapLayer();
arrowLine = new Polyline();
arrowLayer.AddChild(arrowLine, end);
UpdateMapLine();
UpdateArrowPolyline();
}
#endregion
#region properties
public double HeadWidth { get; set; }
public double HeadHeight { get; set; }
public Color Color { get; set; }
public int StrokeThikness { get; set; }
public Location Start { get; private set; }
public Location End { get; private set; }
public MapPolyline Line
{
get
{
return line;
}
}
public MapLayer Arrow
{
get
{
return arrowLayer;
}
}
#endregion
private void UpdateMapLine()
{
line.Stroke = new SolidColorBrush(drawingColor);
line.StrokeThickness = StrokeThikness;
line.Opacity = 1;
line.Locations = new LocationCollection()
{
Start,
End
};
}
private void UpdateArrowPolyline()
{
double theta = Math.Atan2(Start.Latitude - End.Latitude, Start.Longitude - End.Longitude);
double sint = Math.Sin(theta);
double cost = Math.Cos(theta);
Point corner1;
Point corner2;
if (!Start.Equals(End))
{
corner1 = new Point(
(HeadWidth*cost - HeadHeight*sint),
0 - (HeadWidth*sint + HeadHeight*cost));
corner2 = new Point(
(HeadWidth*cost + HeadHeight*sint),
(HeadHeight*cost - HeadWidth*sint));
}
else
{
corner1 = new Point(0,StrokeThikness/2);
corner2 = new Point(0,-StrokeThikness/2);
}
Point endPoint = new Point(0, 0);
arrowLine.Stroke = new SolidColorBrush(drawingColor);
arrowLine.StrokeThickness = StrokeThikness;
arrowLine.Opacity = 1;
arrowLine.Points = new PointCollection()
{
corner1,
endPoint,
corner2
};
}
}