Зажим значений степени до 0 <= x <360 алгебраически - PullRequest
3 голосов
/ 04 июля 2011

С учетом функции:

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? Это выглядит просто ... некрасиво. (Не говоря уже о ... медленно.)

Ответы [ 4 ]

6 голосов
/ 04 июля 2011

В 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).

2 голосов
/ 04 июля 2011

с модулем?

angle = mod(angle,360.0)
2 голосов
/ 04 июля 2011

Вы можете использовать модуль, который делит на 360, но возвращает остаток вместо результата деления: 380 mod 360 = 20. Обратите внимание, что -380 mod 360 = -20

0 голосов
/ 04 июля 2011

Есть ли в вашем языке оператор модуля, который работает с плавающей запятой?% В 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 для получения полной информации.В итоге я считаю, что это можно использовать для реализации необходимых алгоритмов.

...