Как рассчитать расстояние при прохождении нескольких точек на одной линии? - PullRequest
2 голосов
/ 14 января 2020

Время в пути не учитывает кратчайший путь, но путешествие по одной и той же железнодорожной линии через несколько станций.

public double TravelTimeOnSameLine(IStation from, IStation to, int speed)
{
    //check values
    if (from == to || from == null || to == null || speed <= 0)
        throw new ArgumentException();

    var commonLines = from.Lines.Intersect(to.Lines);
    if (!commonLines.Any())
    {
        throw new ArgumentException();
    }

    var line = commonLines.First();
    var distance = 0.0;

    //how to fimd the path?
    var path = new List<IStation>();
    var current = from;
    path.Add(from);


    while (current != to)
    {
        current = line.Next(current);
        path.Add(current);

    }

    for (int i = 0; i < path.Count; i++)
    {
        IStation firstStation = null;
        IStation secondStation = null;

        firstStation = from;
        secondStation = to;

        //calcul de distance entre deux points;
        var distanceBetween1and2 = GetDistancebtween(firstStation.X, firstStation.Y, secondStation.X, secondStation.Y);
        distance = distance + distanceBetween1and2;

    }

    var travelTime = distance / speed;
    return travelTime;
}

Я пытаюсь пройти последние юнит-тесты (строки кода 12-16, где разная скорость используется для одинакового расстояния и последней строки с добавлением нескольких станций на одной линии поезда, которые графически не находятся на одной и той же горизонтальной или вертикальной линии), и мне не хватает вычисления, когда я считаю время в пути на нескольких станциях.

public void T2_travel_time_on_simple_stations()
{
    ICity c = CityFactory.CreateCity("Paris");

    IStation s = c.AddStation("Opera", 0, 0);
    IStation s1 = c.AddStation("Chatelet", 10, 0);

    ILine l = c.AddLine("RER A");
    l.AddBefore(s);
    l.AddBefore(s1);

    c.TravelTimeOnSameLine( s, s1, 1).Should().Be(10.0);
    c.TravelTimeOnSameLine( s, s1, 10).Should().Be(1.0);
    c.TravelTimeOnSameLine( s, s1, 100).Should().Be(0.1);
    c.TravelTimeOnSameLine( s, s1, 20).Should().Be(0.5);
    c.TravelTimeOnSameLine( s, s1, 20).Should().Be(c.TravelTimeOnSameLine( s1, s, 20));
}
[Test]
public void T3_travel_time_on_more_stations()
{
    ICity city = CityFactory.CreateCity("Paris");

    IStation a = city.AddStation("A", 0, 0);
    IStation b = city.AddStation("B", 0, 10);
    IStation c = city.AddStation("C", 10, 10);
    IStation d = city.AddStation("D", 10, 0);

    ILine l1 = city.AddLine("ligne 1");

    l1.AddBefore(a);
    l1.AddBefore(b);
    l1.AddBefore(c);
    l1.AddBefore(d);

    city.TravelTimeOnSameLine( a, d, 1).Should().Be(30.0);
}

Сообщение об ошибке Ожидаемое значение 10,0, но найдено 20,0.

...