C# 两个角度之间的最小差异?

C# 两个角度之间的最小差异?,c#,math,xna,C#,Math,Xna,我想计算两个角度之间的最小差值 这是我当前的代码(与我在网上找到的代码略有不同): 它工作正常,除了在圆的边缘。例如,如果当前角度为355,目标角度为5,则计算出的差值为-350,而不是10,因为365度等于5度 关于我可以做些什么来实现这一点,你有什么想法吗?你可以将结果标准化为0你可以展开越界角度检查: if (dif < 0) dif = dif + 360; if (dif > 180) dif = 360 - dif; if(dif180)dif=360-dif; 基本上

我想计算两个角度之间的最小差值

这是我当前的代码(与我在网上找到的代码略有不同):

它工作正常,除了在圆的边缘。例如,如果当前角度为355,目标角度为5,则计算出的差值为-350,而不是10,因为365度等于5度


关于我可以做些什么来实现这一点,你有什么想法吗?

你可以将结果标准化为0你可以展开越界角度检查:

if (dif < 0) dif = dif + 360;
if (dif > 180) dif = 360 - dif;
if(dif<0)dif=dif+360;
如果(dif>180)dif=360-dif;

基本上你已经拥有了它。在检查是否大于180之前,只需取dif模数360:

float a1 = MathHelper.ToDegrees(Rot);
float a2 = MathHelper.ToDegrees(m_fTargetRot);

float dif = (float)Math.Abs(a1 - a2) % 360;

if (dif > 180)
    dif = 360 - dif;

dif = MathHelper.ToRadians(dif);
编辑:@Andrew Russell在对您的问题的评论中提出了一个很好的观点,下面的解决方案利用了他建议的MathHelper.WrapAngle方法:

diff = Math.Abs(MathHelper.WrapAngle(a2 - a1));

我从来不喜欢用case语句处理零包装。相反,我使用点积的定义来计算两个角度之间的(无符号)角度:

vec(a)。向量(b)=| | | | | | | | b | | cos(θ)

我们只需要做a和b单位向量,所以a | | | a | |==| | b |==1

由于vec(x)=[cos(x),sin(x)],我们得到:

unsigned_angle_theta(a,b) = acos(cos(a)cos(b) + sin(a)sin(b))

(注意:所有角度均以弧度表示)

这看起来是正确的。此外,您实际上不需要转换为度,然后再转换回弧度-您可以在以下答案中计算弧度NoLove for
MathHelper.WrapAngle
:(太棒了,@Andrew。我是在不了解MathHelper的情况下来的,但WrapAngle似乎是书面解决方案。我希望你发布了一个解决方案,但既然你没有发布,我会更新我的答案。为什么否决?如果你不解释你认为的错误,它无法改进答案。我怎么知道是增加还是减少差异ce?抱歉,我不太确定你在问什么…代码应该是完整的,并且总是返回一个介于0和180之间的正值(包括0和180)。请注意
MathHelper.WrapAngle
以弧度工作,因此如果使用它,不要进行度转换。(事实上,这根本就没有必要:2π弧度=360度。别忘了我们的朋友
MathHelper.TwoPi
!)这一点太棒了,@Andrew。我应该指出,转换成度是不必要的。
float a1 = MathHelper.ToDegrees(Rot);
float a2 = MathHelper.ToDegrees(m_fTargetRot);

float dif = (float)Math.Abs(a1 - a2) % 360;

if (dif > 180)
    dif = 360 - dif;

dif = MathHelper.ToRadians(dif);
diff = Math.Abs(MathHelper.WrapAngle(a2 - a1));
unsigned_angle_theta(a,b) = acos(cos(a)cos(b) + sin(a)sin(b))