【问题标题】:Matrix3D for a positive rotation around z in WPFMatrix3D 用于在 WPF 中围绕 z 进行正旋转
【发布时间】:2015-12-09 14:45:28
【问题描述】:

令 P 为 Point3D 使得 P = {1,0,0} 。我需要定义一个围绕 Z 轴 +45deg 的旋转并将其应用于 P。在右手约定下,定义了变换 M:

M =

0.707 -0.707 0 0    
0.707 0.707 0 0     
0 0 1 0             
0 0 0 1              

数学上:

M x P =

0.707 -0.707 0 0         1           0.707
0.707 0.707 0 0     X    0       =   0.707
0 0 1 0                  0           0
0 0 0 1                  1           1

这是我的 C# 代码:

    private void testMatrix3D() {
        double angle_rad = Math.PI/4;
        double cos = Math.Cos(angle_rad);
        double sin = Math.Sin(angle_rad);
        Matrix3D mat = new Matrix3D(cos, -sin, 0, 0, sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);

        Point3D p = new Point3D(1, 0, 0);

        Point3D transformedP = mat.Transform(p);


        Debug.WriteLine("p = " + p);
        Debug.WriteLine("mat = " + mat);
        Debug.WriteLine("transformedP = " + transformedP);

    }

不幸的是,结果是transformedP = {0.707, -0.707, 0} 而不是transformedP= {0.707, 0.707, 0}

我做错了什么?

【问题讨论】:

    标签: c# wpf matrix


    【解决方案1】:

    由于 WPF 将向量按行存储在矩阵中,因此您需要交换它们:

    Matrix3D mat = new Matrix3D(cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
    

    【讨论】:

    • 谢谢@JeffRson。那么 Transform() 方法在矩阵乘法方面做了什么?我认为这不是 p = mat X p 。
    • 如果我理解正确答案,Transform() 完全符合您的预期,您只是在行和列之间错误地填充了矩阵。顺便说一句,WPF 是什么?
    • 我认为这不仅是一般情况下的乘法,因为第 4 行包含偏移量(加法),但在你的情况下这并不重要——@Guiroux:WPF 是“Windows Presentation Foundation” ,看那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2011-08-22
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多