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)
循环中是否存在代数解?它只是看起来......丑陋.(更不用说......慢.)
在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]间隔之前比较角度是没有意义的.