Java Atan2() Сортировка нарушает генеральный договор?
У меня возникли проблемы с методом сравнения, который используется в Java/Processing.
Он говорит, что нарушает свой общий контракт, что, как я понимаю, означает, что он не работает над отношениями между предметами последовательно...
Но я не понимаю почему. Поскольку он просто возвращает угол, тета, основываясь на соотношении ycor к xcor (например, sin к cos), не должна ли она сортировать их последовательно, основываясь на их положениях от 0 до 360 градусов?
public int compareTo(Orb other) {
double X = Math.atan2(ycor,xcor);
if (Math.atan2(other.ycor,other.xcor) > X) {
return -1;
}
if (Math.atan2(other.ycor,other.xcor) == X) {
return 0;
}
return 1;
}
Любая помощь очень ценится, спасибо!
Конкретный контекст заключается в том, что ошибка возникает при запуске Collection.Sort().
1 ответ
РЕДАКТИРОВАТЬ: см. Комментарий Луи Вассермана выше:
Возможно ли, что
xcor
а такжеycor
оба равны нулю для некоторых из них? Я подозреваю, что это приведет к NaN. Переключение наDouble.compare(Math.atan2(ycor, xcor)
,Math.atan2(other.ycor, other.xcor))
должен работать.
Внизу было содержание этого поста; ЭТО ВЕРОЯТНО НЕПРАВИЛЬНО
Неясно, является ли один угол "большим", чем другой - если я от вас по часовой стрелке на 170 градусов, то я также против вас на 190 градусов.
Даже если вы решите использовать "в пределах 180 градусов" как большее, вы все равно не будете удовлетворены неравенством треугольника.