夹紧度值 0 <= x < 360 代数
给定函数:
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 循环是否有代数解?它只是看起来……丑陋。 (更不用说......慢。)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在 C 或 C++ 中,您可以使用
fmod
摆脱一些循环。相反:这样做:
不要使用普通的模运算符 (
%
),因为它适用于整数,并且不会对浮点值执行正确的操作。您的第一个循环:
可以用以下内容替换:
但我认为您应该重新考虑算法的这一部分:在将角度标准化为 [0,360) 区间之前比较角度是没有意义的。
In C or C++ you'd use
fmod
to get rid of some of your loops. Instead of this:Do this:
Don't use the normal modulus operator (
%
) as that's for integers and won't do the right thing with floating point values.Your first loop:
Can be replaced with just this:
But I think you should rethink that part of your algorithm: there's no point in comparing the angles before you normalize them to the [0,360) interval.
与模数 ?
with modulus ?
您可以使用模数,它除以 360,但返回余数而不是除法结果:
380 mod 360 = 20
。请注意-380 mod 360 = -20
You could use modulus, which divides by 360 but returns the remainder instead of the result of the division:
380 mod 360 = 20
. Do note that-380 mod 360 = -20
您的语言是否有适用于浮点的模数运算符? Java 中的%。这给出除以数字时的余数。
(是的,余数的概念在应用于浮点数时很奇怪,但 Java 至少给出了一个有用的定义。)
与下面的注释相反,在 Java 中 % 在语言规范中被明确定义:
请参阅 http://java.sun.com/docs/books/ jls/third_edition/html/expressions.html 了解完整详细信息。我相信这可以用来实现所需的算法。
Does your language have a modulus operator that works for floating point? The % in Java. This gives the remainder when dividing by a number.
(Yes the concept of a remainder is weird when applied to floating point numbers, but Java at least does give a useful definition.)
Contrary to the comments below, in Java % is explictly defined in the language specification:
See http://java.sun.com/docs/books/jls/third_edition/html/expressions.html for the full details. Bottom line I believe that this can be used to implement the required algorithms.