2016-03-15 5 views
1

Я этот код, написанный с использованием этого: source1 и это: source 2Вычислить площадь многоугольника с широтой и долготой

public static double CalculatePolygonArea(IList<GpsLocation> coordinates) 
    { 
     double area = 0; 

     if (coordinates.Count > 2) 
     { 
      for (var i = 0; i < coordinates.Count-1; i++) 
      { 
       GpsLocation p1, p2; 
       p1 = coordinates[i]; 
       p2 = coordinates[i + 1]; 
       area += ToRad(p2.Longitude - p1.Longitude) * (2 + Math.Sin(ToRad(p1.Latitude)) 
        + Math.Sin(ToRad(p2.Latitude))); 

       area = area * R * R/2; 
      } 
     } 

     return Math.Abs(area); 
    } 

Вот мой тестовый код:

[Fact] 
    public void GpsPolygonAreaTest() 
    { 
     var poly = new List<GpsLocation>(); 
     var p1 = new GpsLocation(0, 0); 
     poly.Add(p1); 
     var p2 = GpsHelper.CreateLocationBasedOnBearingDistance(p1, 5, 100); 
     poly.Add(p2); 
     var p3 = GpsHelper.CreateLocationBasedOnBearingDistance(p2, 95, 100); 
     poly.Add(p3); 
     var p4 = GpsHelper.CreateLocationBasedOnBearingDistance(p3, 185, 100); 
     poly.Add(p4); 
     poly.Add(p1); 

     var area = GpsHelper.CalculatePolygonArea(poly); 

     area.Should().Be(10000); 
    } 

Я подтвердил, что мой многоугольник 100м x 100м, см. изображение: the polygon

Мой результат теста: Ожидаемое значение должно быть 10000, но найдено 1.28153883 377486E + 48.

Какие-либо идеи, что не так с моим кодом?

ответ

1

Я уверен, что это заявление:

area = area * R * R/2; 

должен быть помещен после того, как петли над вершинами, а не повторяется на каждой итерации.

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