钳位度值为0 <= x <0。 360代数

时间:2011-07-04 07:34:58

标签: c++ math trigonometry

鉴于功能:

void Arc::SetAngles(double startAngle, double endAngle) {
    while(endAngle > (startAngle + 359.0)) endAngle -= 1.0;
    while(startAngle > 360.0) startAngle -= 360.0;
    while(startAngle < -360.0) startAngle += 360.0;
    while(endAngle > 360.0) endAngle -= 360.0;
    while(endAngle < -360.0) endAngle += 360.0;
    _startAngle = DegreeToRadian(startAngle);
    _endAngle = DegreeToRadian(endAngle);
}

那些循环时是否有代数解决方案?它只是看起来......丑陋。 (更不用说......慢。)

4 个答案:

答案 0 :(得分:6)

在C或C ++中,您可以使用fmod来摆脱一些循环。而不是:

while(startAngle > 360.0) startAngle -= 360.0;
while(startAngle < -360.0) startAngle += 360.0;

这样做:

startAngle = fmod(startAngle, 360.0);
if(startAngle < 0)
    startAngle += 360.0;

不要使用普通模数运算符(%)作为整数的运算符,并且不会使用浮点值做正确的事情。

你的第一个循环:

while(endAngle > (startAngle + 359.0)) endAngle -= 1.0;

可以替换为:

if(endAngle > startAngle + 359.0)
    endAngle = startAngle + 359.0;

但我认为你应该重新考虑算法的那一部分:在将它们标准化为[0,360]间隔之前比较角度没有意义。

答案 1 :(得分:2)

有模数?

angle = mod(angle,360.0)

答案 2 :(得分:2)

您可以使用模数,它除以360但返回余数而不是除法结果:380 mod 360 = 20。请注意-380 mod 360 = -20

答案 3 :(得分:0)

您的语言是否具有适用于浮点的模数运算符? Java中的%。除以数字时,这给出余数。

startAngle = startAngle % 360.0

(是的,当应用于浮点数时,余数的概念很奇怪,但Java至少确实给出了一个有用的定义。)

与下面的评论相反,Java%在语言规范中明确定义:

  

15.17.3剩余运营商%

     

在C和C ++中,余数运算符   只接受整数操作数,但是   它也是Java编程语言   接受浮点操作数。

有关详细信息,请参阅http://java.sun.com/docs/books/jls/third_edition/html/expressions.html。底线我相信这可以用来实现所需的算法。