WPF中的旋转3D散点图数据无法按预期工作

时间:2013-11-28 10:29:13

标签: c# wpf rotation

我已按照this文章中提供的模型显示WPF中的散点图数据。我可以轻松地在视图矩阵中旋转图像,但我需要旋转原始数据点,并将z轴值的最小二乘拟合到z = 0平面。我只需要将数据旋转5-20度,所以我认为我不需要四元数来避免gimble锁定。我尝试了以下方法,并尝试在旋转之前将数据转换为原点,但它没有按预期工作。 RotateX方法似乎有效,但其他两种方法似乎在y轴或z​​轴上将所有数据压缩在一起。我已经检查了大约10个不同网站的公式,但找不到任何错误,但结果仍然没有意义。

    public static Point3D RotateAboutX(Point3D pt1, double aX)
    {
        double angleX = 3.1415926 * aX / 180;

        double x2 = pt1.X;
        double y2 = (pt1.Y * Math.Cos(angleX)) - (pt1.Z * Math.Sin(angleX));
        double z2 = (pt1.Y * Math.Sin(angleX)) + (pt1.Z * Math.Cos(angleX));

        return new Point3D(x2, y2, z2);
    }

    public static Point3D RotateAboutY(Point3D pt1, double aY)
    {
        double angleY = 3.1415926 * aY / 180;

        double x2 = (pt1.X * Math.Cos(angleY)) - (pt1.Z * Math.Sin(angleY));
        double y2 = pt1.Y;
        double z2 = (pt1.X * Math.Sin(angleY)) + (pt1.Z * Math.Cos(angleY));

        return new Point3D(x2, y2, z2);
    }

    public static Point3D RotateAboutZ(Point3D pt1, double aZ)
    {
        double angleZ = 3.1415926 * aZ / 180;

        double x2 = (pt1.X * Math.Cos(angleZ)) - (pt1.Y * Math.Sin(angleZ));
        double y2 = (pt1.X * Math.Sin(angleZ)) + (pt1.Y * Math.Cos(angleZ));
        double z2 = pt1.Z;

        return new Point3D(x2, y2, z2);
    }

1 个答案:

答案 0 :(得分:1)

我发现了自己的错误。错误在上面的RotateAboutY()方法中。正确的方法是这样的......

    public static Point3D RotateAboutY(Point3D pt1, double aY)
    {
        double angleY = 3.1415926 * aY / 180;

        double x2 = (pt1.Z * Math.Sin(angleY)) + (pt1.X * Math.Cos(angleY));
        double y2 = pt1.Y;
        double z2 = (pt1.Z * Math.Cos(angleY)) - (pt1.X * Math.Sin(angleY));

        return new Point3D(x2, y2, z2);
    }

可以使用正确的公式找到here对此主题的简短处理。在Kirupa.com上有关于此主题的更详细说明,其中还包括正确的公式。