四元数比较?

时间:2011-04-27 11:53:00

标签: java math comparison comparable quaternions

四元数比较是否可行?我正在编写一个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 个答案:

答案 0 :(得分:2)

您可以通过比较其字段来实现compareTo。但是,您需要确定订单的内容。 AFAIK,对复杂数字之前或之后没有标准定义,更不用说四元数了。

答案 1 :(得分:2)

你当然可以比较它们;这种比较是否有意义是值得商榷的。由于四元数可以由四个实数表示,因此您只需执行类似(伪代码)

的操作
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;

由于值是实数,您可以使用基于epsilon的比较,并且需要将小的正负差异转换为正整数和负整数。但是你明白了。

答案 2 :(得分:1)

没有理由不能比较两个四元数。假设您想要比较幅度,请计算并比较Quaternion Norms。你的Quaternion类应该有一个norm(幅度)方法,允许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;
}

答案 3 :(得分:1)

四元数是一种四维向量。 你想怎么订购?最合理的方法是使用标准。

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

请注意,使用norm将使四元数相等但指向不同的方向相等,并且某些算法将无法区分它们。排序算法可能会丢掉“重复”。只是一个友好的警告。

答案 4 :(得分:0)

将四元数视为四个浮点数的元组(有序列表)。定义平等非常简单,但是如何定义总排序?换句话说,您想如何定义两个四数字序列之间的大于关系?

事实上,即使复数之间也没有常见的大于关系,四元数可以被认为是一对复数。易于比较只能在一维空间中进行。复数是二维的四元数 - 四。

答案 5 :(得分:0)

你可以,但我认为你不应该。

该参数与复数相同。给定两个四元数,它们是相同还是不相等,没有办法说哪一个大于另一个。四元数形成除法代数,它不是有序的(例如,与实数的字段不同)。我能想到的唯一(合理的)方法,比较两个四元数就是使用标准。

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

在这种情况下,您可以定义,如果是 a <的规范,则四元数 a 大于四元数 b / em>大于 b 的范数。但这绝对不是一个标准的定义。我会小心地将四元数或复数相提并论。但是,这取决于您的使用案例。请注意,没有标准的方法来对这些数字进行排序。

有关比较复数的一些好链接,请参阅此google search。四元数的论证基本相同。

比较四元数的另一种方法是使用lexicographic order

答案 6 :(得分:0)

四元数或复数没有数学标准排序。

您可能希望实现Comparable界面,以方便排序并将其存储在TreeSetTreeMap集合中。

为了明确排序是任意的,我将使用四元数组件的词典组合。这也确保了排序与equals一致,并且算法可以按需运行。

对于更自然的排序,例如考虑规范的排序,您始终可以明确定义比较器。