以代数方式将度数值钳位到0 <= x <360

Cas*_*sey 3 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);
}
Run Code Online (Sandbox Code Playgroud)

循环中是否存在代数解?它只是看起来......丑陋.(更不用说......慢.)

mu *_*ort 6

在C或C++中,你可以fmod用来摆脱一些循环.而不是这个:

while(startAngle > 360.0) startAngle -= 360.0;
while(startAngle < -360.0) startAngle += 360.0;
Run Code Online (Sandbox Code Playgroud)

做这个:

startAngle = fmod(startAngle, 360.0);
if(startAngle < 0)
    startAngle += 360.0;
Run Code Online (Sandbox Code Playgroud)

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

你的第一个循环:

while(endAngle > (startAngle + 359.0)) endAngle -= 1.0;
Run Code Online (Sandbox Code Playgroud)

可以替换为:

if(endAngle > startAngle + 359.0)
    endAngle = startAngle + 359.0;
Run Code Online (Sandbox Code Playgroud)

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