Единство Нахождение различий между А и В в списке эффективно - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь вычислить разницу в числах между 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 Ответ

0 голосов
/ 25 февраля 2019

Я полагаю, 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();
}
...