Реализация вращения через кватернион. Где ошибка? Пытаюсь реализовать вращение точки. Задача такая: есть молекула, для каждого атома три координаты. У этой молекулы есть группа -C-O-H. Нужно развернуть -O-H на определенный угол вокруг оси C-O. Написал реализацию на java, на простых координатах всё отлично работает, на реальных данных не работает. Помогите, пожалуйста, найти ошибку. (В main-классе закомментированны данные, которые не работают)Main-classpublic class App2 /** * @param args the command line arguments */ public static void main(String[] args) {
// Vector carbon = new Vector(0.864, -8.606, -0.389); // Vector oxygen = new Vector(-0.495, -8.775, -4.434); // Vector hydrogen = new Vector(-0.682, -9.652, -0.809);
Vector carbon = new Vector(0, 0, 0); Vector oxygen = new Vector(2, 2, 2); Vector hydrogen = new Vector(4, 1, 1);
double angle = Math.PI/2;
// Создаем вектор, вокруг которого будем вращать точку, и нормализуем его Vector direction = oxygen.residual(carbon); direction = direction.normalize(); // На основе направляющего вектора и угла вращения создаем кватернион и нормализуем его Quaternion q = new Quaternion(angle, direction); q = q.normalize(); // Тут вектор, который будем вращать Vector rotate = hydrogen.residual(carbon); // Вращаем rotate = rotate.transform(q); rotate = rotate.sum(carbon);
System.out.println(rotate);
}
}Quaternion.javapublic class Quaternion {
double w; double i; double j; double k;
public Quaternion(double angle, Vector vecDir) { this.w = Math.cos(angle/2); i = vecDir.x*Math.sin(angle/2); j = vecDir.y*Math.sin(angle/2); k = vecDir.z*Math.sin(angle/2); }
Ошибка в методе toString() класса Vector. Неправильно указан формат для форматирования строк. Вместо "2f" нужно использовать "%.2f". Исправьте эту ошибку и программа должна корректно работать.
Исправленный метод toString() в классе Vector:
@Override public String toString() { return String.format("%.2f %.2f %.2f", x, y, z); }
После внесения этого изменения программа должна верно отображать результат вращения точки.
Ошибка в методе toString() класса Vector. Неправильно указан формат для форматирования строк. Вместо "2f" нужно использовать "%.2f". Исправьте эту ошибку и программа должна корректно работать.
Исправленный метод toString() в классе Vector:
@Overridepublic String toString() {
return String.format("%.2f %.2f %.2f", x, y, z);
}
После внесения этого изменения программа должна верно отображать результат вращения точки.