Является ли функция WPF Matrix3D.Rotate () неточной? - PullRequest
0 голосов
/ 23 июля 2010

В настоящее время я пытаюсь обернуть голову вокруг WPF, и я нахожусь на этапе преобразования пространств координат со структурами Matrix3D.

После понимания того, что 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 градусов, похоже, возвращает неточности с плавающей запятой. Строка смещения матрицы, кажется, отключена незначительным фактором (в любом случае, 0,000001), что приводит к наложению на рендеры. Я что-то здесь упускаю или мне просто нужно вручную округлить матрицу?

Приветствия

1 Ответ

2 голосов
/ 23 июля 2010

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

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

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

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