给定功能:
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);
}
这些while循环是否有代数解决方案?看起来很丑。 (更不用说...慢了。)
最佳答案
在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)间隔之前比较角度是没有意义的。