Единство Нахождение различий между А и В в списке эффективно

Я пытаюсь вычислить разницу в числах между 2 баллами, из списка около 90 баллов. Код у меня так далеко:

int positiveCounter = 0;
        int positiveResetCounter = currentWayPointID;
        int negativeCounter = 0;
        int negativeResetCounter = currentWayPointID;
        while ((currentWayPointID + positiveResetCounter) != pos)
        {
            positiveCounter++;
            positiveResetCounter++;
            if(positiveResetCounter > navigationTrack.AllWayPoints.Count)
            {
                positiveResetCounter = 0;
            }
        }
        while((currentWayPointID+negativeResetCounter) != pos)
        {
            negativeCounter++;
            negativeResetCounter--;
            if(negativeResetCounter < 0)
            {
                negativeResetCounter = navigationTrack.AllWayPoints.Count;
            }
        }
        if(positiveCounter <= negativeCounter)
        {
            MoveForward();
        }
        else if(negativeCounter < positiveCounter)
        {
          //  MoveBack();
        }

Это работает как задумано, но это слишком много для обновления, чтобы справиться. Как я могу сделать это менее обременительным способом? Чтобы дать немного больше контекста, у меня есть список путевых точек и транспортных средств, которые движутся на каждом транспортном средстве, которое движется к точке, наиболее близкой к моей позиции мышки. Путь является круговым, поэтому последняя путевая точка соединяется первой первой (индекс 0). Я пытаюсь определить кратчайший путь к каждой путевой точке, чтобы идти вперед или назад, и код выше - моя попытка вычислить, какой путь идти. Я не ищу способ заставить это двигаться, поскольку это уже работает.

1 ответ

Я предполагаю pos является целевым индексом путевой точки, которую вы хотите достичь.

вместо while циклы и смещение индексов вы можете просто сравнить индексы напрямую:

Допустим, у вас есть список путевых точек, как

[WP0, WP1, WP2, WP3, WP4, ... WPn]

так что доступные индексы 0 в nдлина списка n+1

Допустим currentWayPointID = n а также pos = 2,

То, что вы хотите знать, это то, быстрее ли идти назад или вперед. Итак, вы хотите сравнить, какая разница меньше:

идти назад

n - 2 // simply go steps backwards until reaching 2

или идти вперед, используя виртуальный расширенный список

(n+1) + 2 - n; // add the length of the list to the target index

или визуализировать это

                 [WP0,   WP1,   WP2,   WP3,   WP4, ... WPn]

index:              0,     1,     2,     3,     4, ...     n
extended index: n+1+0, n+1+1, n+1+2, n+1+3, n+1+4, ... n+n+1

Таким образом, для того, чтобы обобщить, вам нужно только сначала проверить, является ли currentwaypointID до или после pos что-то вроде

bool isForwards = true;
if(currentwaypointID >= pos)
{
    if(currentwaypointID  - pos < navigationTrack.AllWayPoints.Count + pos - currentwaypointID)
    {
        isForwards = false;
    }
}
else
{
    if(pos - currentwaypointID > navigationTrack.AllWayPoints.Count + currentwaypointID - pos)
    {
        isForwards = false;
    }
}

if(isForwards)
{
    MoveForward();
}
else
{
    MoveBack();
}
Другие вопросы по тегам