夹紧度值 0 <= x < 360 代数

发布于 2024-11-18 05:50:29 字数 512 浏览 2 评论 0 原文

给定函数:

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 循环是否有代数解?它只是看起来……丑陋。 (更不用说......慢。)

Given the function:

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);
}

Is there an algebraic solution to those while loops? It just looks...ugly. (Not to mention...slow.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你又不是我 2024-11-25 05:50:29

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

In C or C++ you'd use fmod to get rid of some of your loops. Instead of this:

while(startAngle > 360.0) startAngle -= 360.0;
while(startAngle < -360.0) startAngle += 360.0;

Do this:

startAngle = fmod(startAngle, 360.0);
if(startAngle < 0)
    startAngle += 360.0;

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:

while(endAngle > (startAngle + 359.0)) endAngle -= 1.0;

Can be replaced with just this:

if(endAngle > startAngle + 359.0)
    endAngle = startAngle + 359.0;

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.

吃不饱 2024-11-25 05:50:29

与模数 ?

angle = mod(angle,360.0)

with modulus ?

angle = mod(angle,360.0)
一百个冬季 2024-11-25 05:50:29

您可以使用模数,它除以 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

心的位置 2024-11-25 05:50:29

您的语言是否有适用于浮点的模数运算符? Java 中的%。这给出除以数字时的余数。

startAngle = startAngle % 360.0

(是的,余数的概念在应用于浮点数时很奇怪,但 Java 至少给出了一个有用的定义。)

与下面的注释相反,在 Java 中 % 在语言规范中被明确定义:

15.17.3 余数运算符 %

在 C 和 C++ 中,余数运算符
只接受整数操作数,但在
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.

startAngle = startAngle % 360.0

(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:

15.17.3 Remainder Operator %

In C and C++, the remainder operator
accepts only integral operands, but in
the Java programming language, it also
accepts floating-point operands.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文