给定功能:

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)间隔之前比较角度是没有意义的。

09-08 08:03