2010-09-24 2 views
2

Мне нужно нарисовать линии, чтобы продемонстрировать транспортировку товаров на картах бинга. Чтобы уточнить начальную и конечную точку, я нарисую небольшую стрелку на стороне назначения. Проблема в том, что когда я просматриваю глобальную карту, некоторые строки рисуются по кратчайшему пути «по спине». Например, из Нью-Йорка в Токио он будет проходить через Тихий океан. Поскольку стрелка нарисована отдельно, она обращена вспять.Рисование стрелок на картах бинга в 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 
     }; 
    } 
} 

ответ

0

Самый короткий (Великий круг) - это правильный способ его нарисовать. Меняются ли при увеличении до 2d проекции?

Не могли бы вы определить, какой вид отображается и изменить ориентацию на основе этого?

Смежные вопросы