Единство Нахождение различий между А и В в списке эффективно
Я пытаюсь вычислить разницу в числах между 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();
}