Quaternion Сравнение? - PullRequest
       37

Quaternion Сравнение?

6 голосов
/ 27 апреля 2011

Возможно ли кватернионное сравнение? Я пишу Java-класс Quaternions и хочу реализовать интерфейс Comparable для использования средства Collections.sort(List<Quaternion>). Я не специалист по математике, я действительно не понимаю, что я читаю о Quaternions. Итак, кто-нибудь может сказать мне, можно ли переопределить метод compareTo для кватернионов и как?

Мой класс:

public class Quaternion implements Serializable, Comparable<Quaternion> {

    private double s; // scalar part
    private double i, j, k; // vectorel part


    public Quaternion() {
        super();
    }

    public Quaternion(double s, double i, double j, double k) {
        super();
        this.s = s;
        this.i = i;
        this.j = j;
        this.k = k;
    }

Ответы [ 7 ]

2 голосов
/ 27 апреля 2011

Вы, конечно, можете сравнить их;является ли сравнение значимым или нет, открыто для обсуждения.Поскольку кватернион может быть представлен четырьмя действительными числами, вы просто должны сделать что-то вроде (псевдокод)

if (q1.a != q2.a)
    return q1.a - q2.a;
else if (q1.b != q2.b)
    return q1.b - q2.b;
else if (q1.c != q2.c)
    return q1.c - q2.c;
else
    return q1.d - q2.d;

Поскольку значения являются действительными числами, вы можете использовать сравнение на основе эпсилона, и вам необходимо преобразоватьнебольшие положительные и отрицательные различия в положительные и отрицательные целые числа.Но вы поняли.

2 голосов
/ 27 апреля 2011

Вы можете реализовать сравнение, сравнивая его поля. Тем не менее, вам необходимо определить, каким должен быть заказ. AFAIK, стандартного определения того, что происходит до или после комплексных чисел, не говоря уже о кватернионе, не существует.

1 голос
/ 27 апреля 2011

Кватернион - это разновидность 4-мерного вектора.Как вы хотите заказать их?Наиболее разумным способом было бы использование нормы.

public int compareTo(Object o) {
  if (o instanceOf Quaternion) {
    // Compute the difference between the square of the norm
    double result = s*s + i*i + j*j + k*k - o.s*o.s - o.i*o.i - o.j*o.j - o.k*o.k;
    if (result > 0) { return 1; }
    if (result < 0) { return -1; }
    return 0;
  }
}

Обратите внимание, что использование нормы приведет к тому, что кватернионы будут равны по длине, но будут указывать в разных направлениях, и некоторые алгоритмы не смогут различить их.Алгоритмы сортировки вполне могут выбросить «дубликаты».Просто дружеское предупреждение.

1 голос
/ 27 апреля 2011

Нет причин, по которым вы не можете сравнить два кватерниона.Предполагая, что вы хотите сравнить величины, рассчитайте и сравните Quaternion Norms .Ваш класс Quaternion должен иметь метод нормы (величины), позволяющий toCompare выглядеть примерно так:

int compareTo(Quaternion o){
  return (int)(this.norm() - o.norm());
}

Лучшей версией будет:

int compareTo(Quaternion o){
  // return (int)(this.norm() - o.norm());
  double tNorm = this.norm;
  double oNorm = o.norm;
  int retVal = 0;

  if (tNorm < oNorm){
    retVal = -1;
  } else if (tNorm > oNorm){
    retVal = 1;
  }

  return retVal;
}
0 голосов
/ 27 апреля 2011

Нет математического стандартного порядка для кватернионов или комплексных чисел.

Тем не менее, вы можете реализовать интерфейс Comparable для удобной сортировки и хранения их в коллекциях TreeSet и TreeMap..

Чтобы понять, что порядок произвольный, я бы использовал лексикографическую комбинацию компонентов кватерниона.Это также гарантирует, что порядок соответствует equals и что алгоритмы работают так, как нужно.

Для более естественного порядка, например, такого, который учитывает норму, вы всегда можете явно определить компаратор.

0 голосов
/ 27 апреля 2011

Можно, но я не думаю, что вам следует.

Аргумент такой же, как и для комплексных чисел.Учитывая два кватерниона, они либо равны, либо нет, невозможно сказать, какой из них больше другого.Кватернионы образуют алгебру с делением, которая не упорядочена (в отличие, например, от поля действительных чисел).Единственный (разумный) способ сравнения двух кватернионов - использование нормы.

double norm = Math.sqrt(s*s + i*i + j*j + k*k);

В этом случае вы можете определить , что кватернион a больше кватерниона b , если норма a больше нормы b .Но это определенно не стандартное определение.Я был бы осторожен в сопоставлении кватернионов или комплексных чисел.Однако это зависит от вашего варианта использования.Просто учтите, что не существует стандартного способа сортировки таких чисел.

См. Этот поиск в Google , где приведены некоторые полезные ссылки для сравнения комплексных чисел.Аргумент для кватернионов в основном такой же.

Еще один способ сравнения кватернионов - использовать лексикографический порядок .

0 голосов
/ 27 апреля 2011

Представьте кватернионы как кортеж (упорядоченный список) из четырех чисел с плавающей точкой. Определение равенства довольно просто, но как бы вы определили общий порядок? Другими словами, как вы хотите определить больше чем отношение между двумя последовательностями из четырех чисел?

На самом деле, нет общих больше-чем отношений, даже между комплексными числами и кватернионами можно рассматривать как пару комплексных чисел. Простое сравнение возможно только в одномерном пространстве. Комплексные числа двумерные, кватернионы - четыре.

...