确定最短路线的方向
Determining direction for the shortest route
首先,这是一道数学题,我不是在寻找与图像处理相关的代码。
我有一个罗盘,0 到 360 度。
指针当前指向 0 度。
指针位置永远不能超过 360 (compassLimits.Max) 并且永远不能低于零度 (compassLimits.Min),这些都是任何指南针的常规限制。
我想通过最短路线以 1 度为步长将指针移动到下一个位置。
如果下一个位置(目标)在10度,我想把针移动到11度,然后12度等等,直到我到达目标位置。
但是,如果目标位置是350度,我想将针向后移动到359、358等
我可以使用以下 (C#) 算法确定哪条路线最短:
var compassLimits = new
{
Max = 360.0,
Min = 0.0
};
var indirect = Math.Abs(compassLimits.Max - targetValue) + Math.Abs(compassLimits.Min - currentValue);
var direct = Math.Abs(targetValue - currentValue);
if (direct < indirect)
{
shortestDistance = direct;
}
else
{
shortestDistance = indirect;
}
我现在需要确定针是应该向前移动还是向后移动以到达目标,而我的大脑今天不工作,所以与其反复试验和错误尝试,我想我应该把它扔掉.
显然,我不能指望目标值大于当前值,因为这对于从 0 度移动到 10 度时效果很好,但在从 0 度移动到 350 度时会失败。
上面的 shortestDistance 变量始终为正值,因为我正在使用 Math.Abs() 来计算它。
那么如何确定指针应该移动的方向呢?
这取决于直接和间接以及目标值是否大于当前值,所以你有两个一半的答案:
if (direct < indirect)
{
shortestDistance = direct;
if (currentValue < targetValue)
{
Console.WriteLine("Forward");
}
else
{
Console.WriteLine("BackWard");
}
}
else
{
shortestDistance = indirect;
if (currentValue < targetValue)
{
Console.WriteLine("BackWard");
}
else
{
Console.WriteLine("Forward");
}
}
首先,这是一道数学题,我不是在寻找与图像处理相关的代码。
我有一个罗盘,0 到 360 度。
指针当前指向 0 度。
指针位置永远不能超过 360 (compassLimits.Max) 并且永远不能低于零度 (compassLimits.Min),这些都是任何指南针的常规限制。
我想通过最短路线以 1 度为步长将指针移动到下一个位置。
如果下一个位置(目标)在10度,我想把针移动到11度,然后12度等等,直到我到达目标位置。
但是,如果目标位置是350度,我想将针向后移动到359、358等
我可以使用以下 (C#) 算法确定哪条路线最短:
var compassLimits = new
{
Max = 360.0,
Min = 0.0
};
var indirect = Math.Abs(compassLimits.Max - targetValue) + Math.Abs(compassLimits.Min - currentValue);
var direct = Math.Abs(targetValue - currentValue);
if (direct < indirect)
{
shortestDistance = direct;
}
else
{
shortestDistance = indirect;
}
我现在需要确定针是应该向前移动还是向后移动以到达目标,而我的大脑今天不工作,所以与其反复试验和错误尝试,我想我应该把它扔掉.
显然,我不能指望目标值大于当前值,因为这对于从 0 度移动到 10 度时效果很好,但在从 0 度移动到 350 度时会失败。
上面的 shortestDistance 变量始终为正值,因为我正在使用 Math.Abs() 来计算它。
那么如何确定指针应该移动的方向呢?
这取决于直接和间接以及目标值是否大于当前值,所以你有两个一半的答案:
if (direct < indirect)
{
shortestDistance = direct;
if (currentValue < targetValue)
{
Console.WriteLine("Forward");
}
else
{
Console.WriteLine("BackWard");
}
}
else
{
shortestDistance = indirect;
if (currentValue < targetValue)
{
Console.WriteLine("BackWard");
}
else
{
Console.WriteLine("Forward");
}
}