我正在尝试从大约90点的列表中计算2点之间的数字差异。到目前为止,我拥有的代码:
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)。 我试图确定到每个航路点的最短路径,以便前进或后退,上面的代码是我尝试计算要走的路。 我没有在寻找一种使它移动的方法,因为它已经起作用了。
答案 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();
}