2010-07-23 2 views
0

Я сейчас пытаюсь обернуть голову вокруг WPF, и я нахожусь на этапе преобразования между координатными пространствами с структурами Matrix3D.Является ли функция WPF Matrix3D.Rotate() непримиримой?

После того, как WPF имеет разницу между Point3D и Vector3D (это два часа, я никогда не вернусь ...) Я могу получить матрицу перевода. Теперь я пытаюсь ввести матрицу вращения, но, похоже, это дает незыблемые результаты. Вот мой код для моего мира преобразования координат ...

private Point3D toWorldCoords(int x, int y) 
    { 


     Point3D inM = new Point3D(x, y, 0); 


     //setup matrix for screen to world 
     Screen2World = Matrix3D.Identity; 

     Screen2World.Translate(new Vector3D(-200, -200, 0)); 
     Screen2World.Rotate(new Quaternion(new Vector3D(0, 0, 1), 90)); 

     //do the multiplication 
     Point3D outM = Point3D.Multiply(inM, Screen2World); 

     //return the transformed point 
     return new Point3D(outM.X, outM.Y, m_ZVal); 


    } 

перевод, кажется, работает хорошо, поворот на 90 градусов, однако, кажется, вернуться inaacuracies с плавающей точкой. Строка смещения матрицы, кажется, отключена небольшим фактором (0,000001 в любом случае), который производит наложение на визуализацию. Есть что-то, чего я здесь не хватает, или мне просто нужно вручную обойти матрицу?

Приветствия

ответ

2

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

Вы выполняете 4 умножения и суммируете результаты для каждого элемента новой матрицы.

Возможно, было бы лучше установить матрицу Screen2World в качестве матрицы перевода, а не умножать идентификационную матрицу на ваш перевод, а затем на поворот. Это две матричные умножения, а не одна и (более) удвоенная ошибка округления.