鉴于功能:
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);
}
那些循环时是否有代数解决方案?它只是看起来......丑陋。 (更不用说......慢。)
答案 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。底线我相信这可以用来实现所需的算法。